shell編程中for,while,util,case,select,break, continue用法詳解

分類:IT技術 時間:2016-10-09

關於shell腳本的更多詳細實例講解請參考:http://www.cnblogs.com/yuexiaxiaoxi/category/646749.html

Shell編程中循環命令用於特定條件下決定某些語句重復執行的控制方式,有三種常用的循環語句:for、while和until。while循環和for循環屬於“當型循環”,而until屬於“直到型循環”。循環控制符:break和continue控制流程轉向。

參考:《linux 與unix shell 編程指南》

一、while語句結構

w h i l e循環用於不斷執行一系列命令,也用於從輸入文件中讀取數據,其格式為:
while 命令
d o
命令1
命令2
. . .
d o n e
雖然通常只使用一個命令,但在 w h i l e和d o之間可以放幾個命令。命令通常用作測試條
件。
只有當命令的退出狀態為 0時,d o和d o n e之間命令才被執行,如果退出狀態不是 0,則循
環終止。
命令執行完畢,控制返回循環頂部,從頭開始直至測試條件為假。

實例

復制代碼
#!/bin/bash
# Program:
#       This program will show the use of if
# History:
# 2015/1/8 Alex First release
i=10
while [[ $i -gt 5 ]]
do
        echo $i
        i=`expr $i - 1`;            
done
exit 0
註意:在Shell中四則運算不能簡簡單單的加減乘除,應該要寫如下的格式: val1=`$val2 - 1`
其中“=”後面用“`”包住表達式,這個符號在Shell中十分有用,是Tab鍵上面“~”的原來形式。可以用來將很多命令的結果保存到一個變量中去。接著就是運算符了,運算符的左右兩邊必須是空格,否則會出錯。
復制代碼
deyuy/bin/my_shell >> ./while1.sh
10
9
8
7
6
註意:  1.expr命令的用法請參考 http://blog.chinaunix.net/uid-25880122-id-2937521.html
     2.``的作用是運行``之間的命令,並且將命令運行的結果返回。詳細請參考:http://blog.csdn.net/miyatang/article/details/8077123
     3. 更多while實例參考:http://blog.csdn.net/Firefoxbug/article/details/7237319

二、until語句

u n t i l循環執行一系列命令直至條件為真時停止。 u n t i l循環與w h i l e循環在處理方式上剛好
相反。一般w h i l e循環優於u n t i l循環,但在某些時候—也只是極少數情況下, u n t i l循環更加
有用。
u n t i l循環格式為:
until 條件
命令1
. . .
d o n e
條件可為任意測試條件,測試發生在循環末尾,因此循環至少執行一次—請註意這一
點。

until循環中,只要條件不為真,就執行do和done之間的循環命令,或者說,在until循環中,一直執行do和done之間的循環命令,直到條件為真;避免生成死循環。  復制代碼
# Program:
#       This program will show the use of until
# History:
# 2015/1/13 Alex First release

sum=0
num=10

until test $num -eq 0
        do
                sum=`expr $sum + $num`
                num=`expr $num - 1`
        done
echo "sum = $sum"

exit 0

deyuy/bin/my_shell >> sh until.sh
sum = 55
復制代碼

三、for 語句結構

f o r循環一般格式為:
for 變量名i n列表
d o
命令1
命令2…
d o n e

當變量值在列表裏, f o r循環即執行一次所有命令,使用變量名訪問列表中取值。命令可為任何有效的s h e l l命令和語句。
變量名為任何單詞。 in列表用法是可選的,如果不用它, f o r循環使用命令行的位置參數。
in列表可以包含替換、字符串和文件名,列表可以自定義,也可以通過命令返回值生成,下面是一些常用例子。

1) 整數列表  

復制代碼
#!/bin/bash
# Program: # This program will show the use of
for # History: # 2015/1/12 First release
# 自定義列表
for loop in 1 2 3 4 5 do echo "loop=$loop" done exit 0 deyuy/bin/my_shell >> chmod u+x for1.sh deyuy/bin/my_shell >> ./for1.sh loop=1 loop=2 loop=3 loop=4 loop=5 還可以通過讀取文件內容生成變量列表 deyuy/bin/my_shell >> vim num.txt 1 2 3 4 5
6
7
8 #
!/bin/bash # Program: # This program will show the use of for # History: # 2015/1/12 First release
# 以命令返回值作為列表 i
=0 for i in `cat num.txt` do echo "i=$i" done exit 0 deyuy/bin/my_shell >> ./for1.sh i=1 i=2 i=3 i=4 i=5
i=6
i=7
i=8
復制代碼

2) 字符串列表

復制代碼
#!/bin/bash
# Program:
#       This program will show the use of for
# History:
# 2015/1/12 First release
# 自定義列表:帶引號 i
=0 for loop in "Apple hhhh bbbb eeee" do      i=`expr $i + 1` echo "loop=$loop"      echo "count=$i" done exit 0 deyuy/bin/my_shell >> chmod u+x for4.sh deyuy/bin/my_shell >> ./for4.sh loop=apple hhhh bbbb eeee count=1 說明:從結果可以看出for循環打印字符串到結束,包括空格,只執行了一次。如果把 in列表改為 for loop in "apple" "hhhh" "bbbb" "eeee"
則輸出結果為
loop=apple
count=1
loop=hhhh
count=2
loop=bbbb
count=3
loop=eeee
count=4
復制代碼 復制代碼
#!/bin/bash
# Program:
#       This program will show the use of for
# History:
# 2015/1/12 First release
# 自定義列表,不帶引號 i
=0 for loop in apple hhhh bbbb eeeedo     i=`expr $i + 1` echo "loop=$loop"     echo "count=$i"  done exit 0 deyuy/bin/my_shell >> ./for4.sh loop=apple count=1 loop=hhhh count=2 loop=bbbb count=3 loop=eeee count=4 註意:對比兩張方式輸出的不同可以看出,如果用戶想讓把空格分割的每個單詞都輸出要通過第二種方式。
復制代碼

3) 打印當前目錄下所有文件

復制代碼
# Program:
#       This program will show the use of for
# History:
# 2015/1/12 First release
for loop in `ls`
do
        echo "$loop"
done
exit 0

deyuy/bin/my_shell >> sh for2.sh
app1
for1.sh
for2.sh
fun1.sh
hello.sh
hh.sh
if.sh
if2.sh
test.sh
test2.sh
var.sh
while1.sh
復制代碼

4) 循環計數

復制代碼
#!/bin/bash
# Program:
#       This program will show the use of for 
#       統計當前目錄下文件數
# History:
# 2015/1/12 First release
counter=0
for files in *
do
        counter=`expr $counter + 1`
done
echo "There are $counter files in `pwd` directory."
exit 0

deyuy/bin/my_shell >> sh for3.sh
There are 13 files in /home/deyuy/bin/my_shell directory.
復制代碼

5) 使用位置參數

復制代碼
#!/bin/bash
# Program:
#       This program will show the use of for
# History:
# 2015/1/13 release
i=0
for params
do
        i=`expr $i + 1`
        echo "You supplied $params as a command line option"
        echo "count=$i"
done
        echo $params

exit 0

deyuy/bin/my_shell >> ./for5.sh p1 p2 p3
You supplied p1 as a command line option
count=1
You supplied p2 as a command line option
count=2
You supplied p3 as a command line option
count=3
p3
下面的腳本包含i n"$ @",結果與上面的腳本相同。
#!/bin/bash
# Program:
#       This program will show the use of for
# History:
# 2015/1/13 release
i=0
for params in "$@"
do
        i=`expr $i + 1`
        echo "You supplied $params as a command line option"
        echo "count=$i"
done
        echo $params

exit 0

deyuy/bin/my_shell >> ./for5.sh p1 p2 p3
You supplied p1 as a command line option
count=1
You supplied p2 as a command line option
count=2
You supplied p3 as a command line option
count=3
p3
下面的腳本包含i n"$ *",結果與上面的腳本不同。
#!/bin/bash
# Program:
#       This program will show the use of for
# History:
# 2015/1/13 release
i=0
for params in "$*"
do
        i=`expr $i + 1`
        echo "You supplied $params as a command line option"
        echo "count=$i"
done
        echo $params

exit 0


deyuy/bin/my_shell >> ./for5.sh p1 p2 p3
You supplied p1 p2 p3 as a command line option
count=1
p1 p2 p3
說明:關於$@和$*的區別請參考http://www.cnblogs.com/yuexiaxiaoxi/articles/4203609.html
復制代碼

6)循環嵌套

嵌入循環可以將一個f o r循環嵌在另一個f o r循環內:
for 變量名1 in列表1
d o
for 變量名2 in 列表2
d o
命令1
. . .
d o n e
d o n e
下面腳本即為嵌入f o r循環,這裏有兩個列表A P P S和S C R I P T S。第一個包含服務器上應用
的路徑,第二個為運行在每個應用上的管理腳本。對列表 A P P S上的每一個應用,列表
S C R I P T S裏的腳本將被運行,腳本實際上為後臺運行。腳本使用 t e e命令在登錄文件上放一條
目,因此輸出到屏幕的同時也輸出到一個文件。查看輸出結果就可以看出嵌入 f o r循環怎樣使
用列表S C R I P T S以執行列表A P P S上的處理。

 

復制代碼
#!/bin/bash
# Program:
#       This program will show the use of for
# History:
# 2015/1/13 release
APPS="/apps/accts /apps/claims /apps/stock /apps/serv"
SCRIPTS="audit.check report.run cleanup"
MY_DATE=`date +%H:%M" on "%d/%m/%Y`
i=0
j=0
#outer loop
for loop in $APPS
do
        i=`expr $i + 1`
#inner loop
        for loop2 in $SCRIPTS
        do
                j=`expr $i + 1`
                echo "system $loop now running $loop2 at $MY_DATE"
                echo "inner loop counter=$j"
        done
        echo "outer loop counter=$i"
done
        echo $params


deyuy/bin/my_shell >> ./for6.sh
system /apps/accts now running audit.check at 20:53 on 12/01/2015
inner loop counter=2
system /apps/accts now running report.run at 20:53 on 12/01/2015
inner loop counter=2
system /apps/accts now running cleanup at 20:53 on 12/01/2015
inner loop counter=2
outer loop counter=1
system /apps/claims now running audit.check at 20:53 on 12/01/2015
inner loop counter=3
system /apps/claims now running report.run at 20:53 on 12/01/2015
inner loop counter=3
system /apps/claims now running cleanup at 20:53 on 12/01/2015
inner loop counter=3
outer loop counter=2
system /apps/stock now running audit.check at 20:53 on 12/01/2015
inner loop counter=4
system /apps/stock now running report.run at 20:53 on 12/01/2015
inner loop counter=4
system /apps/stock now running cleanup at 20:53 on 12/01/2015
inner loop counter=4
outer loop counter=3
system /apps/serv now running audit.check at 20:53 on 12/01/2015
inner loop counter=5
system /apps/serv now running report.run at 20:53 on 12/01/2015
inner loop counter=5
system /apps/serv now running cleanup at 20:53 on 12/01/2015
inner loop counter=5
outer loop counter=4
復制代碼

四、case結構

c a s e語句為多選擇語句。可以用 c a s e語句匹配一個值與一個模式,如果匹配成功,執行相
匹配的命令。c a s e語句格式如下:
case 值 i n
模式1 }
命令1
. . .
;;
模式2)
命令2
. . .
;;
e s a c
c a s e工作方式如上所示。取值後面必須為單詞 i n,每一模式必須以右括號結束。取值可以
為變量或常數。匹配發現取值符合某一模式後,其間所有命令開始執行直至;;。
取值將檢測匹配的每一個模式。一旦模式匹配,則執行完匹配模式相應命令後不再繼續
其他模式。如果無一匹配模式,使用星號 *捕獲該值,再接受其他輸入。
模式部分可能包括元字符,與在命令行文件擴展名例子中使用過的匹配模式類型相同,
即:
* 任意字符。
? 任意單字符。
[..] 類或範圍中任意字符。

註意:

1.模式字符串中可以使用通配符 2.如果一個模式字符串中包含多個模式,那麽各模式之間應以豎線(|)隔開,表各模式是“或”的關系,即只要給定字符串與其中一個模式相配,就會執行其後的命令列表。 3.各模式字符串應是唯一的,不應重復出現,並且要合理安排它們的出現順序,例如,不應將“*”作為頭一個模式字符串,因為“*”可以與任何字符串匹配,若第一個出現,就不會再檢查其他模式了。 4.case語句以關鍵字case開頭,以關鍵字esac結束。 5.case的退出(返回)值是整個結構中最後執行的命令的退出值。若沒有執行任何命令,則退出值為0. 復制代碼
#!/bin/bash
# Program:
#       This program will show the use of for
# History:
# 2015/1/13 First release
case $1 in
y|Y)
        echo "your choice is yes";;
n|N)
        echo "your choice is no";;
*)
        echo "your choice is others";;
esac
exit 0

deyuy/bin/my_shell >> chmod u+x case.sh
deyuy/bin/my_shell >> ./case.sh y
your choice is yes
deyuy/bin/my_shell >> ./case.sh n
your choice is no
deyuy/bin/my_shell >> ./case.sh jjjj
your choice is others
復制代碼

五、Select結構

格式:

select 變量 in 列表 do 命令行(通常用到循環變量) done

    制作一個選擇表,在列表中選擇一個選項執行命令行。如果選擇的變量不在列表序列中,則返回一個空值。需要用break退出循環。

復制代碼
#!/bin/bash
# Program:
#       This program will show the use of for
# History:
# 2015/1/13 First release
echo "a is 5 ,b is 3. Please select your method: "
a=5
b=3
select var in "a+b" "a-b" "a*b" "a/b"
do
        break
done
case $var in
"a+b")
        echo 'a+b= '`expr $a + $b`;;
"a-b")
        echo 'a-b= '`expr $a - $b`;;
"a*b")
        echo 'a*b= '`expr $a \* $b`;;
"a/b")
        echo 'a/b= '`expr $a / $b`;;
*)
        echo "input error"
esac

deyuy/bin/my_shell >> chmod u+x select.sh
deyuy/bin/my_shell >> ./select.sh
a is 5 ,b is 3. Please select your method:
1) a+b
2) a-b
3) a*b
4) a/b
#? 3
a*b= 15
復制代碼 六、break和continue1、break:用於立即終止當前循環的執行,break命令可以使用戶從循環體中退出來。語法:break[n] ,其中,n表示要跳出幾層循環,默認值為12、continue:跳過循環體中在其之後的語句,會返回到本循環層的開頭,進行下一次循環。語法:continue[n],其中,n表示從包含continue語句的最內層循環體向外跳到第幾層循環,默認值為1,循環層數是由內向外編號。
Tags:

文章來源:


ads
ads

相關文章
ads

相關文章

ad