13.3.5 case邏輯判斷
在shell腳本中,除了用if來判斷邏輯外,還有一種常用的方式——case。其具體格式如下:
?
case 變量 in value1) command ;; value2) command ;; value3) command ;; *) command ;; esac
?
上面的結(jié)構(gòu)中,不限制value的個(gè)數(shù),*代表其他值。下面阿銘寫一個(gè)判斷輸入數(shù)值是奇數(shù)還是偶數(shù)的腳本,如下所示:
?
# vim case.sh //內(nèi)容如下 #! /bin/bash read -p "Input a number: " n a=$[$n%2] case $a in 1) echo "The number is odd." ;; 0) echo "The number is even." ;; *) echo "It's not a number!" ;; esac
?
腳本中$a的值為1或0,其執(zhí)行結(jié)果如下:
?
# sh case.sh Input a number: 100 The number is even. # sh case.sh Input a number: 101 The number is odd.
?
13.4 shell腳本中的循環(huán)
shell腳本可以算是一種簡易的編程語言了,腳本中的循環(huán)也是不能缺少的。常用到的循環(huán)有for循環(huán)和while循環(huán),下面我們就分別介紹一下這兩種循環(huán)結(jié)構(gòu)。
13.4.1 for循環(huán)
for循環(huán)結(jié)構(gòu)是阿銘在日常運(yùn)維工作中使用最頻繁的循環(huán)結(jié)構(gòu)。下面阿銘先寫個(gè)簡單的for循環(huán)腳本,如下所示:
?
# vim for.sh //內(nèi)容如下 #! /bin/bash for i in `seq 1 5`; do echo $i done
?
腳本中的seq 1 5表示從1到5的一個(gè)序列。你可以直接運(yùn)行這個(gè)命令試下。該腳本的執(zhí)行結(jié)果如下:
?
# sh for.sh 1 2 3 4 5
?
通過這個(gè)腳本就可以看到for循環(huán)的基本結(jié)構(gòu),具體格式如下:
?
for 變量名 in 循環(huán)的條件; do command done
?
這里“循環(huán)的條件”可以是一組字符串或者數(shù)字(用一個(gè)或者多個(gè)空格隔開), 也可以是一條命令的執(zhí)行結(jié)果。為了方便演示,阿銘以一條命令的形式給大家舉例,命令如下:
?
# for i in 1 2 3 a b; do echo $i; done 1 2 3 a b
?
“循環(huán)的條件”還可以引用系統(tǒng)命令的執(zhí)行結(jié)果(如seq 1 5),但必須用反引號(hào)括起來。示例命令如下:
?
# for file in `ls`; do echo $file; done case.sh first.sh for.sh if1.sh if2.sh if3.sh option.sh read.sh sum.sh variable.sh
?
13.4.2 while循環(huán)
阿銘常常用while循環(huán)來編寫死循環(huán)的腳本,用于監(jiān)控某項(xiàng)服務(wù)。while循環(huán)的格式也很簡單,如下所示:
?
while 條件; do command done
?
示例腳本如下:
?
# cat while.sh #! /bin/bash a=5 while [ $a -ge 1 ]; do echo $a a=$[$a-1] done
?
該腳本的執(zhí)行結(jié)果如下:
?
# sh while.sh 5 4 3 2 1
?
另外,你可以用一個(gè)冒號(hào)代替循環(huán)條件,這樣可以做到死循環(huán)。示例代碼如下:
?
while :; do command sleep 3 done
?
13.5 shell腳本中的函數(shù)
shell腳本中的函數(shù)就是先把一段代碼整理到一個(gè)小單元中,并給這個(gè)小單元命名,當(dāng)用到這段代碼時(shí)直接調(diào)用這個(gè)小單元的名字即可。有時(shí)候腳本中的某段代碼總是重復(fù)使用,如果寫成函數(shù),每次用到時(shí)直接用函數(shù)名代替即可,這樣不僅節(jié)省時(shí)間還節(jié)省空間。
下面阿銘寫一個(gè)簡單的帶有函數(shù)功能的shell腳本,示例腳本如下:
?
# vim func.sh //內(nèi)容如下 #! /bin/bash function sum() { sum=$[$1+$2] echo $sum } sum $1 $2
?
該腳本的執(zhí)行結(jié)果如下:
?
# sh func.sh 1 2 3
?
func.sh中的sum()為自定義的函數(shù)。在shell腳本中函數(shù)的格式如下:
?
function 函數(shù)名() { command1 command2 }
?
值得注意的是,在shell腳本中,函數(shù)一定要寫在最前面,不能出現(xiàn)在中間或者最后。因?yàn)楹瘮?shù)是要被調(diào)用的,如果還沒有出現(xiàn)就被調(diào)用,肯定會(huì)出錯(cuò)。
13.6 shell腳本中的中斷和繼續(xù)
在shell腳本循環(huán)的過程中,我們難免會(huì)遇到一些特殊需求,比如當(dāng)循環(huán)到某個(gè)地方時(shí)需要做一些事情,這時(shí)候很有可能需要退出循環(huán),或者跳過本次循環(huán),這樣的需求如何實(shí)現(xiàn)呢?
13.6.1 break
首先有一點(diǎn)你需要明白,break用在循環(huán)中,不管是for或者while都可以。在腳本中使用它,表示退出該層循環(huán)。之所以說層,是因?yàn)橛袝r(shí)我們會(huì)用到嵌套循環(huán),大循環(huán)里面還有小循環(huán),而break僅僅是退出那一層循環(huán),它的上層循環(huán)不受影響。下面阿銘給大家寫一個(gè)break的示例,如下所示:
?
# vim break.sh //內(nèi)容如下 #!/bin/bash for i in `seq 1 5` do echo $i if [ $i == 3 ] then break fi echo $i done echo aaaaaaa
?
腳本中,本意是要把1~5數(shù)值賦予i,當(dāng)i等于3時(shí),會(huì)跳出循環(huán),后面的4和5都不會(huì)再執(zhí)行了。該腳本的執(zhí)行結(jié)果如下:
?
# sh break.sh 1 1 2 2 3 aaaaaaa
?
13.6.2 continue
continue也是使用在循環(huán)中的,但和break不同的是,當(dāng)在shell腳本中遇到continue時(shí),結(jié)束的不是整個(gè)循環(huán),而是本次循環(huán)。具體示例如下:
?
# vim continue.sh //內(nèi)容如下 #!/bin/bash for i in `seq 1 5` do echo $i if [ $i == 3 ] then continue fi echo $i done echo $i
?
腳本執(zhí)行結(jié)果如下:
?
# sh continue.sh 1 1 2 2 3 4 4 5 5 5
?
當(dāng)i等于3的時(shí)候,出現(xiàn)了continue,所以結(jié)束本次循環(huán),continue后面的語句不再執(zhí)行,繼續(xù)下一次循環(huán)。
13.6.3 exit
其實(shí),還有一個(gè)和break、continue類似的用法,那就是exit,它的作用范圍更大,直接退出整個(gè)shell腳本。示例腳本如下:
?
# vim exit.sh //內(nèi)容如下 #!/bin/bash for i in `seq 1 5` do echo $i if [ $i == 3 ] then exit fi echo $i done echo aaaaaaa
?
這個(gè)就很容易理解了,腳本執(zhí)行結(jié)果如下:
?
# sh exit.sh 1 1 2 2 3
?
審核編輯:湯梓紅
評(píng)論