if-then
if cmdLine
then
echo "Run the cmd"
fi
或者:
if cmdLine; then
echo "Run the cmd"
fi
- bash shell的
if
語句會(huì)執(zhí)行if
后面的命令(不是表達(dá)式),如果該命令退出狀態(tài)碼為0,位于then
部分的命令就會(huì)執(zhí)行
if-then-else
if cmdLine; then
cmdLine
else
cmdLine
fi
if-then-elif-then-else-fi
if cmdLine; then
cmd
elif cmd; then
cmd
else
cmd
fi
test || []
test condition
-
由于
if
只能判斷命令退出狀態(tài)碼琼讽,若對(duì)于退出狀態(tài)碼之外的條件,需要test命令進(jìn)行測試吩屹,通常結(jié)構(gòu)為:if test condition; then cmd1 else cmd2 fi
如果不寫
test
后面的condition斋竞,test
會(huì)以非零的退出狀態(tài)碼退出,并執(zhí)行else中的cmd2
測試變量是否有內(nèi)容啥刻,可以通過
test $varTest
奸鸯,未包含內(nèi)容返回false-
bash shell中提供另一種方法——
[]
,使用方括號(hào)包圍condition
來進(jìn)行測試:if [ condition ]; then cmd1 else cmd2 fi
注意:左方括號(hào)右側(cè)與右方括號(hào)左側(cè)必須有空格
-
test
命令可以判斷三類條件:- 數(shù)值比較
- 字符串比較
- 文件比較
數(shù)值比較
n1 -eq n2
n1 -gt n2
n1 -lt n2
n1 -ne n2
n1 -le n2
- 數(shù)值比較采用英文字符來表述比較符
- bash shell只能處理整數(shù)可帽,不能進(jìn)行浮點(diǎn)數(shù)比較
字符串比較
str1 = str2
str1 != str2
str1 < str2
str1 > str2
-n str1 檢查str1的長度是否非0
-z str1 檢查str1長度是否為0
-
>
與<
必須轉(zhuǎn)義為\>
娄涩、\<
,若不轉(zhuǎn)義映跟,則將>
與<
當(dāng)做輸入輸出重定向符號(hào):if [ str1 \> str2 ]; then ...
大于和小于的順序與
sort
命令方式不同钝满,主要體現(xiàn)在sort
命令處理大寫字母的方法跟test
命令相反。在test
中申窘,大寫字母被認(rèn)為小于小寫字母弯蚜,因?yàn)?code>test是根據(jù)標(biāo)準(zhǔn)的ASCII順序,sort
是根據(jù)本地化設(shè)置中的順序剃法,英語環(huán)境中碎捺,小寫小于大寫字母。
文件比較
-d file 檢查file是否存在并為一個(gè)目錄
-e file 檢查file是否存在
-f file 檢查file是否存在并為一個(gè)文件
-r file 檢查file是否存在并可讀
-s file 檢查file是否存在并非空
-w file 檢查file是否存在并可寫
-x file 檢查file是否存在并可執(zhí)行
-O file 檢查file是否存在并屬于當(dāng)前用戶所有
-G file 檢查file是否存在并且默認(rèn)組與當(dāng)前用戶相同
file1 -nt file2 檢查file1是否比file2新(new than)
file1 -ot file2 檢查file1是否比file2舊(old than)
復(fù)合條件測試
[ condition1 ] || [ condition2 ]
[ condition1 ] && [ condition2 ]
- 使用布爾邏輯來組合測試
if-else其他高級(jí)特性
雙括號(hào)
(( expression ))
主要用于高級(jí)數(shù)學(xué)表達(dá)式計(jì)算贷洲,expression可以為:
val++
val--
++val
--val
! 邏輯求反
~ 位求反
** 冪運(yùn)算
<< 左位移
>> 右位移
& 位布爾且
| 位布爾或
&& 邏輯且
|| 邏輯或
使用方法為:
if (( $var1 ** 2 > $var2 )); then
...
另外:在雙括號(hào)中大于收厨、小于號(hào)不需要轉(zhuǎn)義
雙方括號(hào)
[[ expression ]]
主要用于字符串比較,expression使用test
命令中采用的標(biāo)準(zhǔn)字符串比較优构,即ASCII碼比較诵叁,但它提供了另一個(gè)特性——模式匹配(pattern matching),例如:
if [[ $USER == franc* ]]; then
...
==
將右邊的字符串franc*
視作一個(gè)模式钦椭,并啟用模式匹配規(guī)則拧额,判斷$USER
變量中是否以franc
開頭碑诉,如果是,執(zhí)行then
后面的cmd
case
case variable in
pattren1 | pattern2) cmd1; ;
pattren3) cmd2; ;
*) defaultCmd3; ;
esac
- 注意括號(hào)格式與末尾分號(hào)格式
-
|
或 -
*
默認(rèn)值
參考文章
Linux Command Line and Shell Scripting Bible
該系列其他文章請查看:
Linux命令行與shell腳本