結構化命令:允許指令碼根據變數值的條件或者其他命令的結果跳過一些命令或者迴圈執行這些命令
1、使用if_then語句
if command
then
commands
fi
先運行if後面的命令,如果命令的退出狀態是0(成功執行命令),就將執行then後面,fi前面的所有命令。否則就跳到fi後面繼續執行。
2、if-then-else語句
if command
then
commands
else
commands
fi
3、嵌套if語句
if command1
then
commands
elif command2
then
commands
elif command3
then
commands
fi
4、test命令(方括弧[ ]為同義字)
用於提供對條件的判斷
if test condition 也可以不用test condition,而使用 [ conditon ] ([ , ] 的前後必須有空格)
then
commands
fi
condition有三種:
(1)數值比較: –eq, –ne, –ge,-gt, -le, lt
但是要注意:test命令無法處理儲存在變數中的浮點值。
使用bash計算機bc時,只是欺騙了shell把浮點值作為字串值儲存於一個變數中。如果只是先使用echo語句顯示結果,這種方法很好。但是在面向數值的函數(如數值測試條件)中不起作用。
底線是不能在test中使用非整數變數
(2)字串比較:=,!=,<,>,-n(檢測字串長度是否大於0),-z(檢測字串長度是否等於0)
字串相等:測試比較將所有標點符號和大寫都考慮在內
字串順序:要注意兩點:
1)’>’,’<’一定要用’\’轉義,否則shell會將它們當做重新導向符號,將字串值看做檔案名稱
2)大於和小於的順序與在sort命令中的順序不同。
在test中,同一個字母,大寫字母>小寫字母
在sort中,相反。
字串大小:評估一個變數是否包含資料時,使用-n和-z比較方便
對空變數和未初始化的變數檢測出的長度也為0
(3)檔案比較
檔案比較是shell指令碼中最強大和最常用的一類比較。
test可以測試檔案狀態和路徑。(使用的非常頻繁!)
-d file: 檢查file是否存在並且是一個目錄
-e file: 檢查file是否存在
-f file: 檢查file是否存在並且是一個檔案
-r file: 檢查file是否存在並且可讀
-s file: 檢查file是否存在並且不為空白
-w file: 檢查file是否存在並且可寫
-x file: 檢查file是否存在並且可執行
-O file: 檢查file是否存在並且被目前使用者擁有
-G file:檢查file是否存在並且預設組是否為目前使用者組
file1 –nt file2: 檢查file1是否比file2新
file1 –ot file2: 檢查file1是否比file2舊
5、複合條件查詢
[ condition1 ] && [ condition2 ]
[ condition1 ] || [ condition2 ]
6、if-then的進階特徵
(1)使用雙圓括弧表示數學運算式
(( expression ))
expression包括除了標準數學操作符外的其他動作符如下:
++, –, !, ~, **, <<, >>, &, |, &&, ||
(2)使用雙方括弧表示進階字串處理函數
[[ expression ]]
提供了除test命令中的標誌字串比較以外的模式比對功能
在模式比對中,可以定義與字串值相匹配的Regex
7、case 命令
可以使用case命令,而不是編寫所有的elif語句來繼續檢查相同的變數值。
case命令以列表導向檢查單個變數的多個值
case variable in
pattern1 | pattern2) commands1;;
pattern3) commands2;;
*) default commands;;
esac