條件測試的表達式:
[ expression ] 括號兩端必須要有空格
[[ expression ]] 括號兩端必須要有空格
test expression
組合測試條件:
- -a: and
- -o: or
- !: 非
整數比較:
- -eq 測試兩個整數是否相等
- -ne 測試兩個整數是否不等
- -gt 測試一個數是否大於另一個數
- -lt 測試一個數是否小於另一個數
- -ge 大於或等於
- -le 小於或等於
命令間的邏輯關係
- 邏輯與:&&
第一個條件爲假 第二個條件不用在判斷,最總結果已經有
第一個條件爲真,第二個條件必須得判斷
- 邏輯或:||
字符串比較
- == 等於 兩邊要有空格
- != 不等
- > 大於
- < 小於
文件測試
- -z string 測試指定字符是否爲空,空着真,非空爲假
- -n string 測試指定字符串是否爲不空,空爲假 非空爲真
- -e FILE 測試文件是否存在
- -f file 測試文件是否爲普通文件
- -d file 測試指定路徑是否爲目錄
- -r file 測試文件對當前用戶是否可讀
- -w file 測試文件對當前用戶是否可寫
- -x file 測試文件對當前用戶是都可執行
- -z 是否爲空 爲空則爲真
- -a 是否不空
for語法格式
for var in list;do
commands
done
其中list可以包含:
1) 直接寫
for alpha in a b c d;do
echo $alpha
done
2)變量
list="a b c d"
for alpha in $list;do
echo $alpha
done
在shell執行的時候會進行變量替換,上面的list變量替換之後,for循環的形式和1中的形式一模一樣。但是如果爲$list加上了引號,即如果寫爲下面的形式:
list="a b c d"
for alpha in "$list";do
echo $list
done
shell變量替換之後爲:
list="a b c d"
for alpha in "a b c d";do
echo $list
done
這時輸出就只有一行a b c d。
3)shell命令
for alpha in `cat alpha.txt`;do
echo $alpha
done
假設alpha.txt文件裏面的內容就是a b c d,那麼通過使用``符先將文件內容讀出,再進行迭代,結果和1一樣
4)讀取文件目錄
for file in $HOME/a/*;do
echo $file
done
上面的代碼先進行通配符glob擴展,假設目錄a下有2個文件1.txt, 2.txt,一個文件夾b,那麼經過擴展之後實際爲:
for file in $HOME/a/1.txt $HOME/a/2.txt $HOME/a/b;do
echo $file
done
此時file的值依次爲$HOME/a/1.txt,$HOME/a/2.txt, $HOME/a/b。
但是假設a不是一個目錄,是一個文件,此時通配符擴展會失敗,此時file的值直接就是$HOME/a/*。
這裏還需要注意的一個地方是,這裏進行的是shell glob的擴展,因此擴展的時候不能越過文件邊界,換句歡說,如果b目錄下面還有文件,這些文件是無法擴展出來的,即擴展無法越過文件夾b
IFS
for循環當中,list的被如何分割就是由IFS決定的,默認情形下,IFS的值是:
Tab
空格
換行
你可以重新給IFS賦值,:
IFS=: #此時分隔符爲:
IFS=:; #此時分隔符爲:和;
C風格的for循環
for (( i = 0; i < 10; i++ ));do
commands
done
這裏的風格和C中一樣,其中的變量i可以是任何變量
while 循環
while command;do
commands
done
其中的command可以是shell command,也可以test condition。如果command的返回值爲0或者測試成立,則執行,否則不執行。
這裏需要注意的是,while可以使用多個條件,但是隻有最後一個條件起作用:
var=100
while [ $var -lt 0 ];[ $var -gt 0 ];do
echo $var
done
在這段代碼中,雖然第一個條件一開始就不成立,但是起作用的是最後一個條件,因此,這是一個無限循環
until循環
until command;do
commnds
done
和while一樣,唯一不同的是如果command返回0,則不執行,否則就執行