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/98054

(0)
李登峰李登峰
上一篇 2018-05-10 17:27
下一篇 2018-05-10 19:04

相關推薦

  • N31-第二周作業—文件的管理

    1、Linux上的文件管理類命令都有哪些,其常用的使用方法及其相關示例演示。
    2、bash的工作特性之命令執行狀態返回值和命令行展開所涉及的內容及其示例演示。
    3、請使用命令行展開功能來完成以下練習:
    (1)、創建/tmp目錄下的:a_c, a_d, b_c, b_d
    (2)、創建/tmp/mylinux目錄下的:
    mylinux/
    ├── bin
    ├── boot
    │?? └── grub
    ├── dev
    ├── etc
    │?? ├── rc.d
    │?? │?? └── init.d
    │?? └── sysconfig
    │?? └── network-scripts
    ├── lib
    │?? └── modules
    ├── lib64
    ├── proc
    ├── sbin
    ├── sys
    ├── tmp
    ├── usr
    │?? └── local
    │?? ├── bin
    │?? └── sbin
    └── var
    ├── lock
    ├── log
    └── run
    4、文件的元數據信息有哪些,分別表示什么含義,如何查看?如何修改文件的時間戳信息。
    5、如何定義一個命令的別名,如何在命令中引用另一個命令的執行結果?
    6、顯示/var目錄下所有以l開頭,以一個小寫字母結尾,且中間至少出現一位數字(可以有其它字符)的文件或目錄。
    7、顯示/etc目錄下,以任意一個數字開頭,且以非數字結尾的文件或目錄。
    8、顯示/etc目錄下,以非字母開頭,后面跟了一個字母以及其它任意長度任意字符的文件或目錄。
    9、在/tmp目錄下創建以tfile開頭,后跟當前日期和時間的文件,文件名形如:tfile-2016-05-27-09-32-22。
    10、復制/etc目錄下所有以p開頭,以非數字結尾的文件或目錄到/tmp/mytest1目錄中。
    11、復制/etc目錄下所有以.d結尾的文件或目錄至/tmp/mytest2目錄中。
    12、復制/etc/目錄下所有以l或m或n開頭,以.conf結尾的文件至/tmp/mytest3目錄中。

    2018-07-05
  • N31第二周

    1、Linux上的文件管理類命令都有哪些,其常用的方法及其相關示例演示: mkdir mkdir:創建目錄 格式:mkdir [OPTION]… DIRECTORY… -m –mode=模式,設定權限<模式> (類似 chmod)? -p 此時若路徑中的某些目錄尚不存在,加上此選項后,系統將自動建立好那些尚不存在的目錄, 即一次可以建立多…

    2018-06-26
  • liunx筆記

    操作系統 :硬件驅動 ? ?進程管理 ? ?內存管理 ? 網絡管理 ? 安全管理 文件管理 。 編程語言 ? :低級語言 ? 機器語言 ?:0和1 ? 中級語言:c ? ?高級語言 :java ?python ? ? ? php . 服務器三大操作系統 ?:windows ? ? ?liunx ? ?unix. liunx 內核 ?:住版本號 ? 次版本號 …

    Linux筆記 2018-04-01
  • LAMP架構實現

    LAMP是一組Web應用軟件的組合,Linux+Apache+Mysql/MariaDB+Perl/PHP/Python一組常用來搭建動態網站或者服務器的開源軟件,所有組成產品均是開源軟件,本身都是各自獨立的程序,但是因為常被放在一起使用,擁有了越來越高的兼容度,共同組成了一個強大的Web應用程序平臺。

    2018-06-23
  • awk工具詳解

    介紹了awk的使用格式,和它的一些使用技巧。

    2018-05-17
  • Linux文件管理及bash特性

    一、Linux上的文件管理類命令都有哪些,其常用的使用方法及其相關示例演示 mkdir,rmdir,pwd,cd,cp,touch,mv 1.mkdir:創建目錄 -p:遞歸創建多個目錄 2.rmdir:刪除空目錄 3.pwd:顯示當前工作目錄 4.cd:切換當前目錄 5.cp:復制文件 單源復制:cp [OPTION]…[T] SOURCE DEST???…

    2018-06-29
欧美性久久久久