shell指令碼和其他程式設計語言一樣提供了程式執行流if esle , do while ,for ,case,等。和其他程式設計語言一樣,shell指令碼的程式執行流的存在是為建立完整的邏輯思維,通過下面幾個指令碼來慢慢學習程式執行流。
首先是if else迴圈與do while迴圈的格式:
單分支:
if CONDITION ; then //需要注意CONDITION語句的格式:[ command ] command左右各有一個空格鍵,並用[ ]括起來
statement //statement可以是多條語句
...
fi
雙分支:
if CONDITION ; then
statement
...
else
statement
...
fi
多分支:
if CONDITION ; then
statement
...
elif CONDITION ; then
statement
...
fi
我們來分析一下這個執行流的意思,
第一種:如果條件成立,那麼執行statement,也就是說如果不成立,那麼就不執行,直接到fi,執行下一個命令,這樣的選擇可以
讓我們輕鬆的過濾一個條件;例如:如果 [一個人犯法了] 那麼 [他就是壞人] 等於預設如果一個人沒有犯法,那麼他就不是壞人.
第二種:如果條件成立,那麼執行statement,執行後到fi,如果不成立,那麼執行else裡的statement,執行後到fi, 它可以讓我們指定兩種分支來處理一個條件。
例如:如果 [一個人犯法了] 那麼 [他就是壞人] 否則 那麼 [他就是一個有待觀察的人] 等於在第一種的基礎上,又添加了一個處理
第三者:這一種,是第一種和第二種的結合,你可以使用elif 來細化 else的條件 ,既在else裡使用if else迴圈,這樣可以細化很多條件並處理,從而得到我們想要
的結果。
————————————————————————————————————————————————————————————————————————————————
do while 迴圈的格式:
while COMMAND; do
statemnet;
....
CONDITION
done
解析:while迴圈可以協助我們實現一種“迴圈的處理”,也就是說不斷的處理一個或者一些內容,或者是不斷的執行某個或某些命令
例如用while迴圈來計算1~100的和
let N=1
let S=0
while [ N -le 100 ]; do //-le小於或等於
S=${$N+$S} //設一個計數器S 它等於上一次的S和這一次的N相加,實現累加
N++ //N自增1
done //注意while迴圈解說要加done
echo S //輸出結果
————————————————————————————————————————————————————————————————————————————————
for 迴圈
for I in LIST ; do
statement1
statement2
done
LIST的格式: 簡單列表: 1 2 3 4
複雜列表: This is TOM`s cat
命令 : `ls /var`
萬用字元 : for I in /var/*
列表可是說是for迴圈的核心,列表可以是命令,數字,文本,甚至是路徑。它的處理方法靈活多變,在很多時候for迴圈的時候可以很清晰明了完成邏輯關係。
下邊通過幾個例子,來學習這些常見的程式執行流。
寫一個指令碼:
1、判斷一個指定的指令碼是否是語法錯誤;如果有錯誤,則提醒使用者鍵入Q或者q無視錯誤並退出,其它任何鍵可以通過vim開啟這個指定的指令碼;
2、如果使用者通過vim開啟編輯後儲存退出時仍然有錯誤,則重複第1步中的內容;否則,就正常關閉退出。c
##使用read -p命令,可以讓列印提示資訊並讓使用者輸入一個變數的值
#!/bin/bash
#TEST=`bash +n $1` //測試指令碼是否有語句錯誤
if [ $TEST!=0 ]; then //如果有錯誤,往下執行,否則,執行else語句
read -p “Q|q for quiting:”INPUT //提示按q或Q退出,並要求使用者輸入
if [ "$INPUT" == 'Q' -o "$INPUT" == 'q' ];then //判斷輸入的資訊
echo "quiting"
else
while [ $TEST!=0 -a "$INPUT" != 'Q' ]; do //迴圈判斷,如果還有錯誤並且沒有輸入Q
vim $1 //開啟vim編輯
TEST=`bash +n $1` //再一次測試語法錯誤
read-p "Q|q for quiting:" INPUT //再一次提示是否退出
INPUT=`echo "$INPUT" | tr 'a-z' 'A-Z'` //這裡將使用者輸入的小寫字母變為大寫
done
fi
fi
unset TEST INPUT
##此指令碼運用了一個多支if else迴圈,和一個for迴圈,在判斷使用者輸入時,第一個簡單的if語句即可實現,但是第二個需將其轉換為大寫來滿足指令碼要求。
寫一個指令碼:
1、向系統中添加20個使用者,名字為linuxer1-linuxer20,密碼分別為其使用者名稱,要使用while迴圈;
2、要求:在添加每個使用者之前事先判斷使用者是否存在,如果已經存在,則不再添加此使用者;
3、添加完成後,顯示linuxer1-linuxer20每個使用者名稱及對應的UID號碼和GID號碼,形如
#!/bin/bash
#
FILE=/etc/passwd
let N=1
while [ $N -le 20 ] ; do
grep "linuxer$N" $FILE >> /dev/null || useradd "linuxer$N";echo "linuxer$N" | passwd --stdin "linuxer$N" // || 或運算,條件不成立則執行下面的語句,成立則不執行下一條語句
let N++
done
for I in {1..20}; do //for迴圈,從1~20執行
grep "linuxer$I" $FILE | //抓取使用者名稱linuxer1~20
awk 'BEGIN{FS=":"}{print $1",UID:" $3",GID:"$4}' //awk語句,在下一篇文章介紹
done