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