shell中的循環語句


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,則不執行,否則就執行

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM