shell腳本的流程分爲三種,順序執行,選擇執行和循環執行。順序執行就是按照腳本中語句的順序依次執行各條語句,每個回車和「;」都表明了下一條命令,而選擇執行是經過選擇語句來對命令進行有選擇的定向執行,循環執行是在特定的條件下重複執行命令。這三種執行流程在使用時能夠靈活的套嵌,來知足咱們的需求shell
順序執行是一個大的框架,腳本里的全部命令均可以看作是在順序執行中嵌套其餘的流程centos
例如bash
#!/bin/bash sum=0 while [ $# -gt 0 ];do sum=$[$(cat $1 | wc -l) + $sum] shift done echo $sum
上面的代碼執行順序是框架
其中上面的第二部分while是循環執行的語句,從while到done能夠看作一個總體。這就是一個順序嵌套循環,在while語句看作一個總體的前提下,命令按照從上到下的順序依次執行也就是順序執行。測試
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
case是另外一中選擇執行語句,其格式爲:
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循環格式:
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
while循環格式
運行機制:
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,它和控制條件配合來限制循環次數
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]#
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]#
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