Shell編程控制結(jié)構(gòu)的基本使用
if-then-else分支結(jié)構(gòu)
if-then-else是一種基于條件測試結(jié)果的流程控制結(jié)構(gòu)。如果測試結(jié)果為真,則執(zhí)行控制結(jié)構(gòu)中相應(yīng)的命令列表;否則將進(jìn)行另外一個條件測試或者退出該控制結(jié)構(gòu)。
if-then-else語法格式:
if 條件1 then 命令列表1 elif 條件2 then 命令列表2 else 命令列表3 fi

執(zhí)行邏輯流程圖
說明:當(dāng)條件1成立時,則執(zhí)行命令列表1并退出if-then-else控制結(jié)構(gòu);如果條件2成立,則執(zhí)行命令列表2并退出if-then-else控制結(jié)構(gòu);否則執(zhí)行命令列表3并退出if-then-else控制結(jié)構(gòu)。在同一個if-then-else結(jié)構(gòu)中只能有一條if語句和一條else語句,eilf語句可以有多條。其中if語句是必須的,elif和else語句是可選的。
Shell腳本首先判斷文件test1是否可讀,如果是,則輸出 is readable !的提示信息;否則不進(jìn)行任何動作。
[root@localhost 20190105]# vi test.sh filename=test1 if [ -r $filename ]//輸出test1可讀則輸出信息 then echo $filename' is readable !' fi [root@localhost 20190105]# sh test.sh test1 is readable !
Shell腳本會判斷number變量是否等于100,如果是,則輸出 The number is equal 100 !的提示;否則輸出 The number is not equal 100 !。
[root@localhost 20190105]# vi number.sh number=200 if [ $number -eq 100 ] //如果number等于100則輸出“The number is equal 100 !”提示 then echo 'The number is equal 100 !' else//否則輸出“The number is not equal 100 !”提示 echo 'The number is not equal 100 !' fi [root@localhost 20190105]# sh number.sh The number is not equal 100 !
Shell腳本首先判斷number變量是否小于10,如果是則輸出 The number < 10 !;否則,判斷number變量是否大于等于10且小于20。如果是則輸出 10 =< The number < 20 !;否則,判斷 number變量是否大于等于20且小于30。如果是,則輸出 20 =< The number < 30 !;否則,輸出 30 <= The number !。
[root@localhost 20190105]# vi number1.sh number=25 if [ $number -lt 10 ] //如果number小于10 then echo 'The number < 10 !' elif [ $number -ge 10 -a $number -lt 20 ] //如果number大于等于10且小于20 then echo '10 =< The number < 20 !' elif [ $number -ge 20 -a $number -lt 30 ] //如果number大于等于20且小于30 then echo '20 =< The number < 30 !' else //除上述3種情況以外的其他情況 echo '30 <= The number !' fi [root@localhost 20190105]# sh number1.sh 20 =< The number < 30 !
case分支結(jié)構(gòu)
if-then-else結(jié)構(gòu)能夠支持多路的分支(多個elif語句),但如果有多個分支,那么程序就會變得難以閱讀。case結(jié)構(gòu)提供了實現(xiàn)多路分支的一種更簡潔的方法。
case語法格式:
case 值或變量 in 模式1) 命令列表1 ;; 模式2) 命令列表2 ;; ... esac
case語句后是需要進(jìn)行測試的值或者變量。Shell會順序地把需要測試的值或變量與case結(jié)構(gòu)中指定的模式逐一進(jìn)行比較,當(dāng)匹配成功時,則執(zhí)行該模式相應(yīng)的命令列表并退出case結(jié)構(gòu)(每個命令列表以兩個分號“;;”作為結(jié)束)。如果沒有發(fā)現(xiàn)匹配的模式,則會在esac后退出case結(jié)構(gòu)。
如下該腳本對number變量的值進(jìn)行測試,與模式匹配的話,則輸出相應(yīng)的信息。
[root@localhost 20190105]# vi case.sh number=66 case $number in 33) echo 'The number is 33 !' //number 變量等于 33 ;; 44) echo 'The number is 44 !' //number 變量等于 44 ;; 55) echo 'The number is 55 !' //number 變量等于 55 ;; 66) echo 'The number is 66 !' //number 變量等于 66 ;; 77) echo 'The number is 77 !' //number 變量等于 77 ;; 88) echo 'The number is 88 !' //number 變量等于 88 ;; esac//結(jié)束 case 結(jié)構(gòu) [root@localhost 20190105]# sh case.sh The number is 66 ! //命令的輸出結(jié)果
for循環(huán)結(jié)構(gòu)
for循環(huán)結(jié)構(gòu)可以重復(fù)執(zhí)行一個命令列表,基于for語句中所指定的值列表決定是繼續(xù)循環(huán)還是跳出循環(huán)。for循環(huán)在執(zhí)行命令列表前會先檢查值列表中是否還有未被使用的值,如有的話,則把該值賦給for語句中指定的變量,然后執(zhí)行循環(huán)結(jié)構(gòu)中的命令列表。如此循環(huán),直到值列表中的所有值都被使用。
for循環(huán)結(jié)構(gòu)語法:
for 變量名 in 值列表 do 命令1 命令2 命令3 ... done
以常量作為值列表
使用變量1、2、3、4、5、6作為值列表,for循環(huán)中只是簡單的把值列表中的值進(jìn)行輸出。
[root@localhost 20190105]# vi for1.sh #!/bin/bash for n in 1 2 3 4 5 6//循環(huán)讀取 1-6 do echo $n done 由運行結(jié)果可以非常清楚的了解for循環(huán)的運行過程。 [root@localhost 20190105]# sh for1.sh 1 2 3 4 5 6
以變量作為值列表
值列表可以是一個環(huán)境變量。
[root@localhost 20190105]# vi for2.sh #!/bin/bash values="1 2 3 4 5 6"http://對 values 變量賦值 for n in $values//循環(huán)讀取 values 變量中的值 do echo $n done [root@localhost 20190105]# sh for2.sh 1 2 3 4 5 6
以命令運行結(jié)果作為值列表
Shell支持使用命令的運行結(jié)果作為for循環(huán)的值列表。在Shell中通過"`命令`"或者“$(命令)”來引用命令的運行結(jié)果。將會以ls命令的結(jié)果作為值列表。
[root@localhost 20190105]# vi for3.sh #!/bin/bash for n in `ls`//循環(huán)讀取 ls 命令的輸出結(jié)果 do echo $n//輸出變量 n 的值 done [root@localhost 20190105]# sh for3.sh case.sh for1.sh for2.sh for3.sh HelloWorld.sh number1.sh number.sh test1 test2 test.sh
expr命令計算器
expr是一個命令行的計數(shù)器,用于加、減、乘、除運算。
[root@localhost 20190105]# expr 123 + 456 - 78 //123 加 456 減 78 等于 501 501 [root@localhost 20190105]# expr 9 \* 8 //9 乘以 8 等于 72 72 [root@localhost 20190105]# expr 666 / 8// 666 除以 8 等于 83 83
在循環(huán)結(jié)構(gòu)中,expr 會被用作增量計算,初始值為10,每次使用expr增加加11/12。注意:這里使用expr命令時都使用的是反撇號,不是單引號。
[root@localhost 20190105]# number=10 [root@localhost 20190105]# number=`expr $number + 11` //對number變量的值加11 [root@localhost 20190105]# echo $number 21 [root@localhost 20190105]# number=`expr $number + 12` //對number變量的值加12 [root@localhost 20190105]# echo $number 33
while循環(huán)結(jié)構(gòu)
while結(jié)構(gòu)會循環(huán)執(zhí)行一系列的命令,并基于while語句中所指定的測試條件決定是繼續(xù)循環(huán)還是跳出循環(huán)。如果條件為真,則while循環(huán)會執(zhí)行結(jié)構(gòu)中的一系列命令。命令執(zhí)行完畢后,控制返回循環(huán)頂部,從頭開始重新執(zhí)行直到測試條件為假。
while循環(huán)結(jié)構(gòu)的語法:
while 條件 do 命令1 命令2 ... done
循環(huán)增量計算:是在while循環(huán)中使用增量計算,其運行結(jié)果如下。
[root@localhost 20190105]# vi while1.sh #!/bin/bash count=0 //將 count 變量置 0 #當(dāng) count 變量小于5時繼續(xù)循環(huán) while [ $count -lt 5 ] do #每循環(huán)一次,count 變量的值加1 count=`expr $count + 1` echo $count done [root@localhost 20190105]# sh while1.sh 1 2 3 4 5 [root@localhost 20190105]#
循環(huán)從文件中讀取內(nèi)容
現(xiàn)有一文件,保存了學(xué)生的成績信息,其中第一列是學(xué)生名,第二列是學(xué)生的成績。
[root@localhost 20190105]# vi students.log jake 85 tom 68 lucy 79 sam 95
現(xiàn)在要對以上文件中的學(xué)生成績進(jìn)行統(tǒng)計,計算學(xué)生的數(shù)量以及學(xué)生的平均成績。通過 while read 語句讀取變量 STUDENT 和 SCORE 的內(nèi)容,然后在 while 循環(huán)中通過 expr 命令計算學(xué)生總數(shù)和學(xué)生總成績,最后計算平均值并輸出。執(zhí)行該腳本時需要把 students.log 文件的內(nèi)容重定向到 while2.sh腳本中。
[root@localhost 20190105]# vi while2.sh #!/bin/bash TOTAL=0//將變量 TOTAL 置 0 COUNT=0//將變量 COUNT 置 0 #循環(huán)讀取數(shù)據(jù) while read STUDENT SCORE do #計算總成績 TOTAL=`expr $TOTAL + $SCORE` #計算學(xué)生數(shù) COUNT=`expr $COUNT + 1` done #計算平均成績 AVG=`expr $TOTAL / $COUNT` echo 'There are '$COUNT' students , the avg score is '$AVG [root@localhost 20190105]# sh while2.sh < students.log There are 4 students , the avg score is 81 [root@localhost 20190105]#
until循環(huán)結(jié)構(gòu)
until是除 for 和 while以外的一種循環(huán)結(jié)構(gòu),它會循環(huán)執(zhí)行一系列命令直到條件為真時停止。
until循環(huán)結(jié)構(gòu)語法:
until 條件 do 命令1 命令2 ... done
until循環(huán)中讀取用戶輸入的內(nèi)容并顯示到屏幕上,當(dāng)用戶輸入的內(nèi)容為 exit 時結(jié)束循環(huán)。
[root@localhost 20190105]# vi until1.sh #!/bin/bash xxx="" #當(dāng) ans 變量的值為 exit 時結(jié)束循環(huán) until [ "$xxx" = exit ] do #讀取用戶的輸入到ans變量 read xxx #如果用戶輸入的不是 exit 則輸出用戶的輸入 if [ "$xxx" != exit ] then echo 'The user input is : '$xxx #否則退出循環(huán) else echo 'Exit the script.' fi done [root@localhost 20190105]# sh until1.sh hello The user input is : hello welcome to HongKong! The user input is : welcome to HongKong! exit Exit the script. [root@localhost 20190105]#
到此這篇關(guān)于Shell編程控制結(jié)構(gòu)的基本使用的文章就介紹到這了,更多相關(guān)Shell 控制結(jié)構(gòu)內(nèi)容請搜索本站以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持本站!
版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非maisonbaluchon.cn所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。
關(guān)注官方微信