Bash作為一種過程式編程語言,擁有一套流程控制體系,可完成選擇執行,循環執行功能。下面分別介紹if/else,case,select,for,while/until等語法的使用。
一、選擇執行
1、if語句
根據條件判斷來選擇執行哪個分支;if語句分為三種形式
1) 單分支
2) 雙分支
3) 多分支
(1) 單分支
語法:
if condition;then #命令不能和then寫在一行 command... fi #if語句結束標志
condition 可以是條件測試:test,[ ],[[ ]];也可是一條命令。根據狀態碼來判斷,0為true,其他為false。為true則執行then后面的語句,為false則不執行。
(2)雙分支
語法:
if condition;then command... else command... fi
判斷condition的真假,為true執行then后面語句,為false則執行else后面語句
Bash的if分支語句不能為空,所以else后面的語句為空的話,else必需省略,則變為單分支形式。
例子,創建一個腳本,實現如下功能:使用一個用戶名做為參數,如果指定參數的用戶存在,就顯示其存在,否則添加之;顯示添加的用戶的id號等信息。
#!/bin/bash [ -z $1 ]&&echo no user name&&exit #判斷傳入參數是否合法 if id $1 &>/dev/null;then #使用id 命令判斷用戶是否存在 echo $1 already exist exit else useradd $1 echo user $1 create complete echo `id -a $1` fi
(3)多分支
語法:
if condition1;then command... #分支1 elif condition2;then command... #分支2 elif condition3;then command... #分支3 ... #分支N else command... #其他情況,可省略 fi
執行邏輯:條件依次判斷,當遇到條件為真時,執行其分支,然后退出if;如果所有條件都為假時,執行else分支,退出if。
例子,編寫一個腳本,判斷用戶輸入文件路徑,顯示其文件類型(普通,目錄,鏈接,其它文件類型)
#!/bin/bash [ ! -e $1 ]&&echo no such file &&exit if [ -d "$1" ];then echo "`basename $1` is a directory" elif [ -L "$1" ];then echo "`basename $1` is a symblic link" elif [ -f "$1" ];then echo "`basename $1` is a regular file" else echo "`basename $1` is an other type file" fi
2、case語句
語法:
case ${var} in part1) command... ;; #分支結束符 part2) command... ;; part3) command... ;; *) command... ;; esac #case語句結束符
case語句在字符串判斷上,可以替代if復雜的語句結構。
part判斷,支持glob風格通配符:
? 代表一個任意字符
* 代表任意長度字符
[] 指定范圍內一個字符
| 或操作符
例子,編寫一個腳本,提示用戶輸入yes或no,并判斷用戶輸入的是yes還是no,或是其它信息。
#!/bin/bash read -p "please choose yes or no ? " input case $input in y|Y|[yY][eE][sS]) #可以支持判斷模糊輸入 echo you answer yes ;; n|no|[nN][oO]) echo you answer no ;; *) echo you answer other ;; esac
二、循環執行
1、for語句
for語句適合執行列表遍歷形式的循環。
語法:
for var in List;do command... done
執行機制:依次將列表中的元素賦值給“變量名”; 每次賦值后即執行一次循環體; 直到列表中的元素耗盡,循環結束。
List給出形式:
(1)直接給出
for var in root mysql ftp;do #分隔符為空格 ...
(2) 整數列表:
(a) {start..end} (b) $(seq [start [step]] end)
(3) 返回列表的命令
$(COMMAND)
(4) 使用glob,如:*.sh
(5) 變量引用;
$@, $*
#!/bin/bash #ping IP 192.168.0.0 到 192.168.255.255 主機在線情況 for ip in 192.168.{0..255}.{0..255} do if ping -W1 -c1 $ip &>/dev/null;then echo $ip is reachable else echo $ip is unreachable fi done
for循環的特殊格式:
和c語言中for循環相同的格式,適合計數形式的循環。
語法:
for ((控制變量初始化;條件判斷表達式;控制變量的修正表達式));do #括號中兩個分號 command... done
控制變量初始化:僅在運行到循環代碼段時執行一次
控制變量的修正表達式:每輪循環結束會先進行控制變量修正運算,而后再做條件判斷
#!/bin/bash # 使用for循環實現1...100加和 for ((i=1;i<=100;i++));do let sum+=i done echo $sum
2、while語句
語法:
while condition; do command... done
condition:循環控制條件,進入循環之前,先做一次判斷;每一次循環之后會再次做判斷;條件為“true”,則執行一次循環;直到條件測試狀態為“false”終止循環
#!/bin/bash #使用while循環實現1到100加和 n=1 while [ $n -le 100 ]; do ((sum+=n)) ((n++)) #條件控制變量修正 done echo $sum
while循環的特殊用法:
用于實現遍歷文件的每一行,根據取到的值進行其他操作。這是for語句做不到的。
語法:
while read line; do command... done < /PATH/FROM/SOMEFILE
依次讀取/PATH/FROM/SOMEFILE文件中的每一行,且將行賦值給變量line。
#!/bin/bash #遍歷passwd文件,給用戶添加備注信息 while read line;do user=`echo $line|cut -d: -f1` #獲取每一行中的用戶名 gecos=`echo $line|cut -d: -f5` if [ -z "$gecos" ];then chfn -f $user -p '62985600' $user &>/dev/null \ #給獲取到的用戶添加備注 &&echo "GECOS of $user has changed"\ ||echo "GECOS of $user failed to change" fi done < /etc/passwd
3、until語句
until語句與while語句形式相同,但是進入循環和退出循環的條件恰恰相反。
語法:
until condition; do command... done
condition:循環控制條件,進入循環之前,先做一次判斷;每一次循環之后會再次做判斷;條件為“false”,則執行一次循環;直到條件測試狀態為“true”終止循環。
#!/bin/bash #使用until實現1到100加和 n=1 until [ $n -gt 100 ]; do #條件判斷為直到n>100停止循環 ((sum+=n)) ((n++)) done echo $sum
4、循環控制語句
控制語句用來提前結束一次循環,或者直接退出循環。
(1)continue
continue [N]:提前結束第N層的本輪循環,而直接進入下一輪判斷;最內層為第1層
#!/bin/bash i=1 while [ $i -le 3 ];do echo ------------ let i++ continue echo ************ done #執行結果,echo ** 在continue后面,永遠不會被執行 ------------ ------------ ------------
(2)break
break [N]:提前結束第N層循環,最內層為第1層
#!/bin/bash i=1 while [ $i -le 3 ];do echo ------------ let i++ break echo ************ done #執行結果,當打印第一次----后,遇到break標志,直接退出循環 ------------
5、select語句
語法:
select var [in List];do #in List 可省略,使用位置變量傳參 command... done
select語句主要用于創建菜單,按數字排列的菜單項將顯示在標準輸出上,并顯示PS3提示符,等待輸入,并且用戶輸入的內容由內置變量REPLY記錄。
select循環是個死循環,循環體中加入break命令退出循環,經常配合case使用。
例子,
#!/bin/bash #腳本如下 PS3='which one would you like?' #定義PS3提示符 select fruit in apple banana orange;do case $fruit in apple) echo "$fruit values 2\$/kg" break ;; banana) echo "$fruit values 1\$/kg" break ;; orange) echo "$fruit values 0.5\$/kg" break ;; esac done [fly@centos7 shell]$ ./select.sh #執行展示 1) apple 2) banana 3) orange which one would you like?2 banana values 1$/kg [fly@centos7 shell]$
原創文章,作者:cutemsyu,如若轉載,請注明出處:http://www.www58058.com/37945
文章對各循環語句語法進行了梳理,通過腳本加深了自己對各語句的認識。關于課后練習需要認真完成,老師選的課后練習,都是筆試中常見的,也是很經典的。