Shell腳本:程序控制

條件測試的表達式:
    [ 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,則不執行,否則就執行

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章