shell腳本編程基礎(3)——循環用法

在前面的基礎編程內容中,我們已經學習了shell腳本的順序執行及選擇執行,通過這兩種方式,可以幫我們解決一些簡單需求,但要想在更復雜的場景中使用的話,就需要掌握循環執行的方式了。

本節索引:

一、if、case條件判斷

二、for、while及until循環

三、循環控制語句continue、break、shift及select菜單

四、信號捕捉trap

 

在前面的基礎編程內容中,我們已經學習了shell腳本的順序執行及選擇執行,通過這兩種方式,可

以幫我們解決一些簡單需求,但要想在更復雜的場景中使用的話,就需要掌握循環執行的方式了。

timg_image&quality=80&size=b9999_10000&sec=1526388520&di=f2bb7e0b3f9f7570155b596

 

一、if、case條件判斷

條件判斷if語句:

if語句是指編程語言中用來判定所給定的條件是否滿足,根據判定的結果(真或假)決定執行

給出的兩種操作之一。

 

格式:

if?? 判斷條件1;then

條件1為真的分支代碼

elif 判斷條件2;then

條件2為真的分支代碼

elif 判斷條件3;then

條件3為真的分支代碼

else

以上條件都不滿足的分支代碼

fi

 

if語句會逐條件的進行判斷,當第一次遇到為“真”的條件時,就會執行其分支代碼,而后結束整個if語句。

 

 

條件判斷case語句:

case語句是實現選擇結構程序設計的一種語句,比較適合處理離散型變量。

格式:

case 變量引用 in

1|2|3)

cmd1

;;

4|5|6)

?? cmd2

;;

7|8|9)

cmd3

;;

*)

??? cmd4

esac

 

注意:case支持glob風格的通配符:

如:*????? 表示任意長度任意字符

???? 表示任意單個字符

[]????? 指定范圍內的任意單個字符

a|b??? a或者b

 

二、for、while及until循環

循環執行

將某代碼段重復運行多次

重復運行多少次

次數已知

次數未知

有進入條件和退出條件

循環主要語句有:for、whlie、until

 

for循環

for語句將循環一個列表中的每一個元素執行一次循環體代碼,直到列表中元素全部執行過一次。

一般用于次數預先知道的循環。

 

格式1:

for 變量名 in 列表;do

循環體

done

 

其中列表的生成方式有多種:

1.直接給出列表

2.整數列表:

(a){start..end[..step]}

(b)$(seq[start[step]end])

3.返回列表的命令:

$(COMMAND)

4.使用glob,如:*.sh

5.變量引用:

$@,$*等

執行機制:

依次將列表中的元素賦值給“變量名”,每次賦值后即執行一次循環體;直到列表中的

元素全部被執行,循環結束

 

格式2:C語言風格

for ((: for (( exp1; exp2; exp3 )); do COMMANDS; done

Arithmetic for loop.

Equivalent to

(( EXP1 ))

while (( EXP2 )); do

COMMANDS

(( EXP3 ))

done

例:利用for循環依次讀取列表{1..100}中的內容,并相加,得出1到100的數字之和

testfor

 

 

while循環

while結構循環為當型循環(when type loop),一般用于不知道循環次數的情況。維持循環的是一個條件表達式,條件成立執行循環體,條件不成立退出循環。

 

格式:

while 循環控制條件;do

???????? 循環體

done

 

循環控制條件:進入循環之前,先做一次判斷;每次循環之后會再次做判斷;當條件為True時,則繼續執行循環;直到條件測試狀態為false時終止循環。

例:利用while循環,定義變量i=0,當i小于100時,執行循環,并讓變量i每執行一次循環加1,直到i=100時停止循環,得出數字1到100之和

testwhile

 

while循環的特殊用法(遍歷文件的每一行):

while read line; do

? 循環體

done < /PATH/FROM/SOMEFILE

依次讀取/PATH/FROM/SOMEFILE文件中的每一行,且將行賦值給變量line

 

for循環與while循環的區別:

for循環與while循環是可以相互替代的;比如:

for i in {1..10};do

echo “OK”

done

用while語句來寫的話:

i=1

while [ $i -le 10 ];do

echo “OK”

let i++

done

 

兩者意思都是打印10次“OK”,那什么時候用for循環,什么時候又用while循環呢?

for循環用于針對集合中的每個元素的一個代碼塊,而while循環不斷的運行,直到指定的條件不滿足為止。

一般來說:

for循環比較適合循環次數確定的情況

while循環適合循環次數不確定的情況

 

 

until循環

維持循環的也是一個條件表達式,但與while用法正好相反,條件不成立時執行循環體,條件成立時退出循環。

until 循環控制條件;do

???????? 循環體

done

 

until語句和while語句可相互轉化:

如:until [ test ];do? 等價于 while [ ! test ];do

 

三、循環控制語句continue、break、shift

continue語句

用于循環體中

continue[N]:提前結束第N層的本輪循環,而直接進入下一輪判斷;最內層為第1層

格式:

while 循環控制條件;do

???????? CMD1

???????? …

???????? if 判斷條件;then

????????????????? continue

???????? fi

???????? CMDn

???????? …

done

 

例:依次打印數字1至10,當continue出現在5循環中時,直接跳過,繼續執行6循環;

當continue出現在嵌套循環中時,continue 2,提前結束第二次本輪循環,并打印3次

testcontinue

 

 

 

break語句

用于循環體中

break[N]:提前結束第N層循環,最內層為第一層

while 循環控制條件;do

???????? CMD1

???????? …

???????? if 判斷條件;then

????????????????? break

???????? fi

???????? CMDn

???????? …

done

 

例:break語句將直接結束本輪循環

testbreak

 

shift命令

shift[n]:將參量列表list左移指定次數,缺省為左移一次,適合用于處理位置參數

參量列表list一旦被移動,最左端的那個參數就從列表中刪除。while循環遍歷位置參量列表時,

常用到shift

例1:利用shifit,每次位置變量向左移動1位,并打印本次全部位置變量,直到位置變量為0個

testdoit

例2:利用shifit,每次變量向左移動一位,并打印本次第一個位置變量,直到位置變量小于1時停止執行

testshifit

 

避免出現無限循環:

while true;do

???????? 循環體

done

 

until false;do

???????? 循環體

done

 

每個程序員都會偶爾不小心而編寫出無限循環,在循環退出條件比較微妙時尤其如此,如果程序陷入無限循環,可按ctrl+c退出

要避免編寫無限循環,務必對每個while、until循環進行測試,確保它按預期那樣結束。

 

 

select循環與菜單

select 變量 in list;do

???????? 循環體命令

done

 

select循環主要用于創建菜單,常與case語句搭配使用,用戶輸入菜單列表中的某個數字,執行相應的命令

select是個無限循環,因此要記住用break命令退出循環,或用戶exit命令終止腳本??砂碿trl+c退出循環

與for循環類似,可以省略in list,此時使用位置變量。

相關變量:

$PS3 ?????? menu菜單提示符

$REPLY??? 保存用戶的輸入信息

 

 

四、信號捕捉trap

trap ‘觸發指令’信號

自定義進程收到系統發出的指定信號好,將執行觸發指令,而不會執行原操作

 

trap ” 信號

忽略信號的操作

 

trap ‘-‘ 信號

恢復原信號的操作

 

trap -p

列出自定義信號操作

 

例:打印數字1到10的過程中,trap -p顯示自定義信號操作,由于trap ”int捕獲了int信號,ctrl+c無法中斷顯示,且顯示自定義輸入:press ctrl+c;

打印數字11到20的過程中,由于trap ”int捕獲了int信號,ctrl+c無法中斷顯示

打印數字21到30的過程中,trap ‘-‘恢復了原信號操作,顧ctrl+c又可中斷顯示

trap

trap2

本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/97879

(2)
wangxczwangxcz
上一篇 2018-05-08 17:46
下一篇 2018-05-09

相關推薦

  • ansible_playbook

    —– hosts: allremote_user: root vars:ports:-81-82-83 vars:ports:– listen_port: 81– listen_port: 82– listen_port: 83 vars:ports:– web1:port: 81#na…

    Linux筆記 2018-07-30
  • DNS服務

    上課筆記

    2018-06-03
  • Linux中 profile、bashrc、bash_profile三配置文件之間的區別和聯系

    在上課中有關注到王老師,對于環境配置參數的修改,由于不太懂,在網上搜索得到的結果,分享給大家

    Linux筆記 2018-07-30
  • Linux發行版之間的聯系和不同

    Linux發行版以及不同發行版本之間的聯系和不同 Linux來源 Unix—minix—Linux tovalds-(1991)—Linux—GNU (GPL) 今天的Linux=Linux內核+GNU應用 1991年后誕生的Linux(一部分著名的Linux發行版):RedHat 、Fedora 、suse 、紅旗 、debian 、Ubuntu? Lin…

    2018-06-27
  • shell 編程基礎

    命令錯誤 后面的命令繼續執行 語法錯誤 后面的命令不執行 bash -n 檢查語法錯位 bash -x 查看腳本的執行過程 【排錯】 ++文件屬性上的 顯示是嵌套命令 變量 引用變量要加$符號 echo 是顯示字符串的 如果命令能識別變量 可以不加$ 識別不了就壓加$ 變量盡量用“ ”引起來 保留里面的格式 name =`whoami` echo &#822…

    Linux筆記 2018-04-15
欧美性久久久久