Linux shell腳本 流程控制

shell腳本的流程分爲三種,順序執行,選擇執行和循環執行。順序執行就是按照腳本中語句的順序依次執行各條語句,每個回車和「;」都表明了下一條命令,而選擇執行是經過選擇語句來對命令進行有選擇的定向執行,循環執行是在特定的條件下重複執行命令。這三種執行流程在使用時能夠靈活的套嵌,來知足咱們的需求shell

一.順序執行

順序執行是一個大的框架,腳本里的全部命令均可以看作是在順序執行中嵌套其餘的流程centos

例如bash

#!/bin/bash

sum=0

while [ $# -gt 0 ];do

        sum=$[$(cat $1 | wc -l) + $sum]

        shift

done

echo $sum

 

上面的代碼執行順序是框架

  1. sum=0
  2. while到倒數第二行的done
  3. echo $sum

其中上面的第二部分while是循環執行的語句,從while到done能夠看作一個總體。這就是一個順序嵌套循環,在while語句看作一個總體的前提下,命令按照從上到下的順序依次執行也就是順序執行。測試

 

二.選擇執行(if/case)

1.ifcentos7

if是選擇執行語句的一種,其格式爲:spa

 

1 if 判斷條件 ;thencode

2 判斷條件爲真時要執行的命令blog

3 elif 判斷條件 ;then字符串

4 判斷條件爲真時要執行的命令

5 else

6 當以上全部判斷都爲假時要執行的命令

7 fi

 

解釋:

第一行的「if」告訴計算機,個人if語句開始了,「判斷條件」告訴計算機什麼狀況下要執行下面的命令,「;」告訴計算機個人判斷條件結束了,「then」告訴計算機接下來該執行命令了,「;then」也能夠理解爲固定格式。

第二行就是第一行告訴計算機要執行的命令

第三行的「elif」就是else if的意思,意思是若是第一行「if」的判斷爲假,則繼續判斷以後「elif」的判斷條件

第四行是「elif」判斷爲真時要執行的命令

第五行的意思是當上面全部的判斷都爲假的時候則執行下面的命令

第六行要寫全部的判斷都爲假的時候執行的命令

第七行告訴計算機我要結束個人if語句了

 

if語句的格式中第三四行能夠根據需求寫無數次,第一二七行必須寫並且只能寫一次,第五六行最多有一次不過能夠不寫,當if語句中有多個elif時,計算機會逐條對判斷條件金星判斷,並執行第一次爲真的判斷條件的命令,若是都爲假,有else則執行else後的命令,五else則直接跳出if語句

例如

#!/bin/bash

a=$1

if [ $a -eq 1 ];then

        echo h

elif [ $a -eq 2 ];then

        echo i

elif [ $a -eq 3 ];then

        echo j

elif [ $a -eq 4 ];then

        echo k

else

        echo F

fi

 

解釋:

在這個腳本中我把a賦值爲輸入的第一個參數,並依此進行判斷,若是a和1相等則輸出h,若是a和2相等則輸出i,若是a和3相等則輸出j,若是a和4相等則輸出k,若是a和1,2,3,4,都不相等則輸出F

 

 2.case

case是另外一中選擇執行語句,其格式爲:

  1. case 變量 in
  2. 判斷值) 執行的命令;;

       3. 判斷值) 執行的命令;;

       4. *)執行的命令;;

       5. esac

 

解釋:

第一行的case告訴計算機個人case語句開始了「變量」是咱們要判斷的數據能夠是數數值也能夠是字符串等等,「in」能夠理解爲固定格式

第二行的判斷值是咱們判斷的依據,「)」是固定格式,告訴計算機個人判斷值結束了,後面是這個判斷值對應的命令「;;」告訴計算機個人執行命令到此結束,這整個一行的意思是,若是第一行的變量和個人判斷值相等則執行後面的命令

第三行同第二行

第四行*表明全部的值,因爲case語句是按順序依次判斷的,因此寫在最後的*)意思就是上面的判斷值和變量都不相等時執行以後的命令

第五行告訴計算機個人case語句結束了

 

case是按照從上至下的順序依次判斷,可根據需求將「判斷值) 執行的命令;;」寫任意條,而判斷則會遍歷這些直到遇到變量和判斷值相等,執行命令並退出case,「*)執行的命令」可根據須要不寫,效果是若是上面的判斷值和變量都不相等則什麼都不執行直接退出case

 

舉例:

#!/bin/bash

case $1 in

        man)echo "男人";;

        woman)echo "女人";;

        [1-9])echo "數字";;

        [[:alpha:]])echo "字母";;

        *)echo "fault";;

esac

 

解釋:

這個腳本中我把輸入的第一個參數看成變量,並依次和下面的判斷值做比較,當輸入值爲man時輸出「男人」當輸入值爲woman時輸出爲「女人」當輸入爲數字時輸出爲「數字」,當輸入爲字母時輸出爲「字母」,當輸入不是上面的這些狀況時輸出爲「fault」

三.循環執行(for/while)

1.for

for循環格式:

1.for 變量 in 列表 ;do

2. 循環體

3. done

運行機制:

依次將列表中的元素賦值給變量,每賦值一次執行一次循環體,直到列表的元素用盡,循環結束

解釋:

第一行的「for」告訴計算機個人for循環語句開始了,「變量」是設置的一個參數用於循環,也能夠在循環體中使用,「in 列表」告訴計算機我要用於循環的元素列表,「do」告訴計算機接下來是循環體也就是要執行的命令

第二行的「循環體」也就是咱們要執行的命令

第三行的「done」告訴計算機循環體結束,進行下一次循環,若是沒有元素了則退出for循環

for循環中列表的書寫方式:

(1) 直接給出列表 a b c

(2) 整數列表:

(a) {start..end} {1..10}

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

(3) 返回列表的命令

$(COMMAND)

(4) 使用glob,如:*.sh

(5) 變量引用;

$@, $*

舉例:

#!/bin/bash

for n in $(seq 10);do

        echo $n

done

 

解釋:

這個腳本效果是輸出1到10,每一次循環,都會按順序從列表「$(seq 10)」中讀取一個值賦給n,並執行echo命令,因此在每一次循環中n的值都不同,因此每次輸出的值也就不同。

 另外for循環也能夠寫成c語言的形式,其格式爲:

for ((i=0;i<b;i++));do

循環體

done

其中i是咱們的循環變量,i=0是把i的初始值設爲0,i<b,b是咱們設置的一個數值,用來告訴循環何時中止,i++的意思是每次循環i自加1

2.while

while循環格式

  1. while CONDITION  ;do
  2. 循環體
  3. done

運行機制:

CONDITION:循環控制條件;進入循環以前,先作一次判斷;每一次循環以後會再次作判斷;條件

「true」,則執行一次循環;直到條件測試狀態爲「false」終止循環

所以CONDTION通常應該有循環控制變量;而此變量的值會在循環體不斷地被修正

解釋:

第一行「while」告訴計算機while循環開始,「CONDITION」是循環控制條件,控制循環,告訴計算機何時結束,「do」開始執行循環體

第二行「循環體」也就是咱們要執行的命令

第三行「done」執行循環體結束並進入下一次循環,若是達到控制條件則退出循環

舉例:

 

#!/bin/bash

n=1

while [ $n -le 5 ];do

        echo $n

        let n++

done

 

解釋:

這個腳本效果是輸出1到5,我先賦值n爲1,在while循環中,控制條件是「[ $n -le 5 ]」意思是n小於等於5,因此第一行的意思是當n小於等於5的時候執行下面的循環體,循環體是輸出n的值,「let n++」的意思是讓n自加1,也就是每循環依次n就會加1,它和控制條件配合來限制循環次數

 

3.循環控制語句(continue/break/shift)

1)continue

continue[N] 用於循環體中意思是結束第N層循環,直接進入下一輪的判斷,N默認爲1

舉例:

 

首先我寫了一個兩層for循環嵌套的腳本,最外層的會執行五次,每次執行會先輸一個序號來告訴咱們這是第幾回的輸出,而後執行內層的for循環,第二個for循環的做用是輸出abc,「echo \ 」的做用是輸出一個換行

#!/bin/bash

for n in {1..5};do

        echo -n $n

        for m in a b c;do

                echo -n $m

        done

        echo \

done

 

執行結果

[root@centos7 bin]# . a.sh

1abc

2abc

3abc

4abc

5abc

 

而後咱們加入一個if語句,其執行的命令爲continue。加入後在執行內層for循環語句的時候先判斷變量m的值是否爲b,若是爲b則執行continue,跳出本次循環也就不會在執行if語句後的輸出語句,跳出本次循環後直接進入下一個內層的for循環

#!/bin/bash

for n in {1..5};do

        echo -n $n

        for m in a b c;do

        if [ $m == b ];then

                continue

        fi

                echo -n $m

        done

        echo \

done

 

執行結果

[root@centos7 bin]# . a.sh

1ac

2ac

3ac

4ac

5ac

 

咱們如今把continue後加一個2,加入後每當變量m的值爲b就會跳出兩層循環,也就是直接進入外層for的下一個循環,因此輸出序號和a後直接進入下一個循環

#!/bin/bash

for n in {1..5};do

        echo -n $n

        for m in a b c;do

        if [ $m == b ];then

                continue 2

        fi

                echo -n $m

        done

        echo \

done

 

執行結果

[root@centos7 bin]# . a.sh

1a2a3a4a5a[root@centos7 bin]#

 

2)break

break N 用於循環體中,提早結束第N層循環,最內層爲第一層

舉例:

仍是上面的例子,咱們把continue換成break,換成break後每當變量m爲b時則跳出整個內層的for循環,而後執行外層for循環的「echo \ 」以後進行下一次的外層for循環

#!/bin/bash

for n in {1..5};do

        echo -n $n

        for m in a b c;do

        if [ $m == b ];then

                break

        fi

                echo -n $m

        done

        echo \

done

 

執行結果

[root@centos7 bin]# . a.sh

1a

2a

3a

4a

5a

 

而後咱們在break後加上2,使之直接跳出兩層循環,當第一次變量m的值爲b時跳出兩層for循環也就是直接運行結束

執行結果

[root@centos7 bin]# . a.sh

1a[root@centos7 bin]#

 

3)shift

shift n 將參數列表向左移動n位,前n位已溢出則直接從列表中刪除

舉例

#!/bin/bash

while [ $# -gt 0 ];do

        echo $*

        shift

done

 

解釋:

「$#」是傳遞給腳本的參數個數,「$*」是傳遞給腳本的所有參數,當參數個數大於0時輸出全部參數並將參數左移

執行結果

[root@centos7 bin]# . a.sh a b c d e

a b c d e

b c d e

c d e

d e

e
相關文章
相關標籤/搜索