[Shell] if、for、while流程語句以及整數字串判斷比較的執行個體詳解,shellwhile
前言:
實際上Shell是一個命令直譯器,它解釋由使用者輸入的命令並且把它們送到核心。不僅如此,Shell有自己的程式設計語言用於對命令的編輯,它允許使用者編寫由shell命令組成的程式。Shell程式設計語言具有普通程式設計語言的很多特點,比如它也有迴圈結構和分支控制結構等,用這種程式設計語言編寫的Shell程式與其他應用程式具有同樣的效果。
一,shell的流程語句1,條件陳述式if else if
範例程式碼:
[root@squid-2 script]# cat s1.sh
#!/bin/bash
echo "Please choose project:"
echo "1:zhu 2:sha"
read project_no
if [ $project_no = "1" ];then
echo "111111"
elif [ $project_no = "2" ];then
echo "222222"
else echo "error"
fi
[root@squid-2 script]#
執行過程如下:
[root@squid-2 script]# sh s1.sh
Please choose project:
1:zhu 2:sha
1
111111
[root@squid-2 script]# sh s1.sh
Please choose project:
1:zhu 2:sha
2
222222
[root@squid-2 script]# sh s1.sh
Please choose project:
1:zhu 2:sha
3
error
[root@squid-2 script]#
2,for 迴圈2.1 for i in
指令碼如下:
[root@squid-2 script]# cat host_list.txt
192.168.1.10
192.168.1.11
192.168.1.12
192.168.1.13
[root@squid-2 script]#
測試執行結果:
[root@squid-2 script]# sh s21.sh
the host ip address is: 192.168.1.10
the host ip address is: 192.168.1.11
the host ip address is: 192.168.1.12
the host ip address is: 192.168.1.13
[root@squid-2 script]#
2.2 for((賦值;條件;運算語句))
指令碼代碼:
[root@squid-2 script]# cat s22.sh
for((i=1;i<=10;i++));do
echo "the loop number i: $i";
done;
[root@squid-2 script]#
執行結果:
[root@squid-2 script]# sh s22.sh
the loop number i: 1
the loop number i: 2
the loop number i: 3
the loop number i: 4
the loop number i: 5
the loop number i: 6
the loop number i: 7
the loop number i: 8
the loop number i: 9
the loop number i: 10
[root@squid-2 script]#
3,while迴圈使用
條件陳述式結構:
while
do
action
done;
測試指令碼:
[root@squid-2 script]# cat s3.sh
#!/bin/sh
i=10;
while [[ $i -gt 5 ]];do
echo"the loop number of while case is: $i";
((i--));
done;
[root@squid-2 script]
執行結果:
[root@squid-2 script]# sh s3.sh
the loop number of while case is: 10
the loop number of while case is: 9
the loop number of while case is: 8
the loop number of while case is: 7
the loop number of while case is: 6
[root@squid-2 script]#
4,until迴圈語句
樣本指令碼:
[root@squid-2 script]# cat s4.sh
#!/bin/sh
a=1;
until [[ $a -gt 6 ]];do
echo"the until number is: $a";
((a++));
done;
[root@squid-2 script]#
執行結果:
[root@squid-2 script]# sh s4.sh
the until number is: 1
the until number is: 2
the until number is: 3
the until number is: 4
the until number is: 5
the until number is: 6
[root@squid-2 script]#
5,shell選擇語句5.1,使用case選擇語句使用(case/esac)
文法結構:
case $arg in
pattern | sample) # arg in pattern or sample
;;
pattern1) # arg in pattern1
;;
*) #default
;;
esac
說明:pattern1 是Regex,可以用下面字元:
* 任意字串
? 任意字元
[abc] a, b, 或c三字元其中之一
[a-n] 從a到n的任一字元
| 多重選取
代碼指令碼:
[root@squid-2 script]# cat s51.sh
#!/bin/sh
case $1 in
start | begin)
echo "start something"
;;
stop | end)
echo "stop something"
;;
*)
echo "Ignorant"
;;
esac
[root@squid-2 script]#
PS:執行結果,這裡需要帶入參數,參數值就在)前面的start、begin、stop、end之內,如果帶入別參數,則返回"Ignorant":
[root@squid-2 script]# sh s51.sh start
start something
[root@squid-2 script]# sh s51.sh begin
start something
[root@squid-2 script]# sh s51.sh end
stop something
[root@squid-2 script]# sh s51.sh stop
stop something
[root@squid-2 script]# sh s51.sh test1
Ignorant
5.2,select語句使用方法(產生菜單選擇)
文法結構:
select 變數name in seq變數
do
action
done
代碼如下:
cat s52.sh
#!/bin/sh
select param in "begin""end" "exit"
do
case $param in
"begin")
echo "start something"
;;
"end")
echo "stop something"
;;
"exit")
echo "exit"
break;
;;
*)
echo "Ignorant"
;;
esac
done;
執行結果:
[root@squid-2 script]# sh s52.sh begin
1) begin
2) end
3) exit
#? 1
start something
#? 2
stop something
#? 3
exit
[root@squid-2 script]#
PS:執行的時候,只有輸入exit,才能退出來執行小視窗。
說明:select是迴圈選擇,一般與case語句使用。
二,shell語句的比較操作符1,整數比較
規則說明:
-eq 等於 if [ "$a" -eq "$b" ]
-ne 不等於 if [ "$a" -ne "$b" ]
-gt 大於 if [ "$a" -gt "$b" ]
-ge 大於等於 if [ "$a" -ge "$b" ]
-lt 小於 if [ "$a" -lt "$b" ]
-le 小於等於 if [ "$a" -le "$b" ]
< 小於(需要雙括弧) (( "$a"< "$b" ))
<= 小於等於(...) (("$a" <= "$b" ))
> 大於(...) (("$a" > "$b" ))
>= 大於等於(...) (("$a" >= "$b" ))
PS:小資料比較可使用AWK
範例程式碼:
[root@squid-2 script]# cat com1.sh
a=$1
b=$2
if [ "$a" -eq "$b" ];then
echo"a = b true."
elif [ ! "$a" -gt "$b" ];then
echo"a > b true."
else echo "a < b true."
fi
[root@squid-2 script]#
測試結果如下:
[root@squid-2 script]# sh com1.sh 1 1
a = b true.
[root@squid-2 script]# sh com1.sh 1 2
a > b true.
[root@squid-2 script]# sh com1.sh 1 0
a < b true.
[root@squid-2 script]#
2,字串比較2.1,規範以及使用
規則說明:
= 等於 if [ "$a"= "$b" ]
== 與=等價
!= 不等於 if [ "$a" ="$b" ]
< 小於,在ASCII字母中的順序:
if [[ "$a" < "$b" ]]
if [ "$a" \< "$b" ] #需要對<進行轉義
> 大於
-z 字串為null,即長度為0
-n 字串不為null,即長度不為0
範例程式碼:
[root@squid-2 script]# cat com2.sh
a=$1
b=$2
# 1 the first method to implement
if [ "$a"x = "$b"x ];then
echo"a = b"
elif [ ! "$a"x = "$b"x ]; then
echo"a != b"
else echo "others"
fi
# 2 the second method to implement
if [ "$a"x == "$b"x ];then
echo "a = b"
elif [ "$a"x != "$b"x ]; then
echo "a != b"
else echo "others"
fi
測試執行結果:
[root@squid-2 script]# sh com2.sh ccb aaa
a != b
a != b
[root@squid-2 script]# sh com2.sh ccb ccb
a = b
a = b
[root@squid-2 script]#
[root@squid-2 script]#
2.2,需要注意的地方
相等判斷需要注意的地方:
比較兩個字串是否相等的辦法是:
if [ "$a"x = "b"x ];then
這裡的關鍵有幾點:
1 使用單個等號
2 注意到等號兩邊各有一個空格:這是unix shell的要求
3 注意到"$a"x最後的x,這是特意安排的,因為當$test為空白的時候,上面的運算式就變成了x = bx,顯然是不相等的。而如果沒有這個x,運算式就會報錯:[: =: unary operator expected
[[ $a == z* ]] # 如果$a以"z"開頭(模式比對)那麼將為true
[[ $a == "z*" ]] # 如果$a等於z*(字元匹配),那麼結果為true
[ $a == z* ] # File globbing 和word splitting將會發生
[ "$a" == "z*" ] # 如果$a等於z*(字元匹配),那麼結果為true
關於File globbing:
一點解釋,關於Fileglobbing是一種關於檔案的速記法,比如"*.c"就是,再如~也是.
但是file globbing並不是嚴格的Regex,雖然絕大多數情況下結構比較像.
特殊字元的比較:
!= 不等於,如:if [ "$a" != "$b" ]
這個操作符將在[[]]結構中使用模式比對.
< 小於,在ASCII字母順序下.如:
if [[ "$a" < "$b" ]]
if [ "$a" \< "$b" ]
注意:在[]結構中"<"需要被轉義.
> 大於,在ASCII字母順序下.如:
if [[ "$a" > "$b" ]]
if [ "$a" \> "$b" ]
注意:在[]結構中">"需要被轉義.
-z 字串為"null".就是長度為0.
-n 字串不為"null"
注意:
使用-n在[]結構中測試必須要用""把變數引起來.使用一個未被""的字串來使用! -z
或者就是未用""引用的字串本身,放到[]結構中。雖然一般情況下可 以工作,但這是不安全的.習慣於使用""來測試字串是一種好習慣。
2.3,判斷字串是否空
範例程式碼:
[root@squid-2 script]# cat com3.sh
#!/bin/bash
a=$1
if [ -z "$a" ]; then
echo"a is empty."
else echo "a is a object."
fi
[root@squid-2 script]
測試執行結果:
[root@squid-2 script]# sh com3.sh a
a is a object.
[root@squid-2 script]# sh com3.sh
a is empty.
[root@squid-2 script]#
3,檔案判斷
規則說明:
-e 檔案存在
-a 檔案存在(已被棄用)
-f 被測檔案是一個regular檔案(正常檔案,非目錄或裝置)
-s 檔案長度不為0
-d 被測對象是目錄
-b 被測對象是塊裝置
-c 被測對象是字元裝置
-p 被測對象是管道
-h 被測檔案是符號串連
-L 被測檔案是符號串連
-S(大寫) 被測檔案是一個socket
-t 關聯到一個終端裝置的檔案描述符。用來檢測指令碼的stdin[-t0]或[-t1]是一個終端
-r 檔案具有讀許可權,針對運行指令碼的使用者
-w 檔案具有寫入權限,針對運行指令碼的使用者
-x 檔案具有執行許可權,針對運行指令碼的使用者
-u set-user-id(suid)標誌到檔案,即普通使用者可以使用的root許可權檔案,通過chmod +s file實現
-k 設定粘貼位
-O 運行指令碼的使用者是檔案的所有者
-G 檔案的group-id和運行指令碼的使用者相同
-N 從檔案最後被閱讀到現在,是否被修改
f1-nt f2 檔案f1是否比f2新
f1 -ot f2 檔案f1是否比f2舊
f1 -ef f2 檔案f1和f2是否硬串連到同一個檔案
樣本指令碼代碼:
[root@squid-2 script]# cat com4.sh
#!/bin/bash
a=$1
file=$2
if [ -d $a ]; then
echo"it is a directory."
elif [ -f "$a" ]; then
echo"it is a file."
else echo "no parameter."
fi
測試回合結果如下:
[root@squid-2 script]# sh com4.sh log1
it is a file.
[root@squid-2 script]# sh com4.sh old
it is a directory.
[root@squid-2 script]#
參考資料:
http://www.cnblogs.com/chengmo/archive/2010/10/14/1851434.html
http://blog.csdn.net/yf210yf/article/category/1475895
bash shell中迴圈與判斷語句的格式
1) [[]] 和[] 基本一樣但是[[]]在某些情況容錯能力強;(())是直接算數運算的意思如((i++));
2,[] 表示test,你 man test就知道啦,程式規定,算數比較用 lt gl eq,字元比較 > ,<..
3,不一定,變數中有空格是必需加上,例如name abc你不用引號就成了$name abc和“$name abc" 不一樣
linux shell編程 if語句不可以判斷變數是否相等
(($num1 != $num2))裡面的是算術運算式
用(($num1 - $num2))
或者[ [ $num1 != $num2 ]]