bash中while,until,case,select語句結構
在腳本中使用case結構:
case ${VAR_NAME} in
PATTERN1)
COMMAND
...
;;
PATTERN2)
COMMAND
...
;;
...
esac
PATTERN(模式)可以是下列幾類字符:
2.Globbing風格的通配符:
*:任意長度的任意字符
?:任意單個字符;
[]:指定範圍內的任意單個字符;
[^]:指定範圍以外的任意單個字符;
3.|
或字符
if的多分支結構和case的選擇分支結構的異同:
相同點:
1.判斷的條件為真時,才會執行對應分支中的語句;條件為假,就跳過不執行;
不同點:
1.if是根據命令的執行狀態返回值的真或假來判斷執行某個分支中的語句;
case是根據變量中所保存的值與指定的模式匹配的結果的真或假來判斷是否該執行某個分支中的語句;
2.if的每個分支中無需單獨到的結束標記,case的每個分支都必須以;;結束;
編寫管理用戶賬戶的腳本,第四版,利用case語句+for循環,同時接受創建和刪除用戶的操作;
#!/bin/bash # #helps函數,顯示提示信息和幫助信息 helps(){ echo -e "Usage: $(basename $0) options... USERLIST\n" echo -e " Options: " echo -e " -a, --add: \vAdd some users from USERLIST." echo -e " -d, --delete: \vDelete some users from USERLIST." echo -e " -h, --help: \vPrint help informationn." echo -e " -v, --verbose: \vPrint more informationn about manage users." echo echo -e " USERLIST FORMAT: " echo -e " USERNAME1,USERNAME2,...,USERNAMEN" } #輸入的選項的個數 if [ $# -lt 1 ] ; then helps exit 5 fi ADDUSER=0 DELUSER=0 DEBUG=0 #對選項進行篩選執行 for I in $(seq $#) ; do if [ $# -ne 0 ] ;then case $1 in -h|--help) helps exit 0 ;; -v|--verbose) DEBUG=1 shift ;; -a|--add) ADDUSERLIST=$2 ADDUSER=1 shift 2 ;; -d|--delete) DELUSERLIST=$2 DELUSER=1 shift 2 ;; *) helps exit 6 ;; esac fi done #執行添加用戶的操作 if [ $ADDUSER -eq 1 ] ; then for J in $(echo $ADDUSERLIST | tr ',' ' ') ; do if ! id $J &> /dev/null ; then useradd $J &> /dev/null echo $J | passwd --stdin $J &> /dev/null [ $DEBUG -eq 1 ] && echo "Create user $J successfully." else echo "$J exist already." fi done fi #執行刪除用戶操作 if [ $DELUSER -eq 1 ] ; then for J in $(echo $DELUSERLIST | tr ',' ' ') ; do if id $J &> /dev/null ; then userdel -r $J &> /dev/null [ $DEBUG -eq 1 ] && echo "Delete user $J finished." else echo "$J does not exist yet." fi done fi #無論選項位置是先-a或者後-a都會先執行添加用戶操作,因為添加用戶的操作執行在前邊,順序執行腳本的內容。
while循環結構
while: while COMMANDS; do COMMANDS; done
在腳本中可以寫成下列結構:
while CONDITION ; do
COMMANDS
done
while循環進入循環的條件:CONDITION邏輯判斷結果為真;
while循環退出循環的條件:CONDITION邏輯判斷結果為假;
until循環結構
until: until COMMANDS; do COMMANDS; done
在腳本中可以寫成下列結構:
until CONDITION ; do
COMMANDS
done
until循環進入循環的條件:CONDITION邏輯判斷結果為假;
until循環退出循環的條件:CONDITION邏輯判斷結果為真;
註意:
1.while CONDITION 相當於 until ! CONDITION
2.while和until循環結構中,沒有變量自增或自減的變化方法,因此需要使用語句手動給出變量的變化方式;
寫一個腳本,使用while或until循環,計算100以內整數的和;
#!/bin/bash # #在$I=100的時候,退出循環,否則判斷會進入101 declare -i I=0 until [ $I -eq 100 ] ; do let I++ let SUM+=$I done echo $SUM #!/bin/bash # declare -i I=0 while [ $I -lt 100 ] ; do let I++ let SUM+=$I done echo $SUM
循環控制語句:
continue
continue: continue [n]
Resume for, while, or until loops.
提前結束第n層當前循環,直接進入下一輪條件判斷,如果條件判斷結果仍然滿足循環進入條件,則開啟下一輪循環;
break
break: break [n]
Exit for, while, or until loops.
提前結束第n層的循環,而且不再繼續後續循環;
while和until的兩種特殊循環使用方法:
1.無限循環方法:
while true ; do
COMMANDS
done
until false ; do
COMMANDS
done
猜數字遊戲:
#!/bin/bash # NUMBER=$[RANDOM%100+1] while true ; do read -p "Input a number: " INPTNUM if [ $INPTNUM -gt $NUMBER ] ; then echo "Too big" elif [ $INPTNUM -lt $NUMBER ] ; then echo "Too small" else echo "Yes! you WIN. That's $NUMBER." #在輸入數字和隨機數字匹配的時候,就退出 break fi done
#!/bin/bash # NUMBER=$[RANDOM%100+1] until false ; do read -p "Input a number: " INPTNUM if [ $INPTNUM -gt $NUMBER ] ; then echo "Too big" elif [ $INPTNUM -lt $NUMBER ] ; then echo "Too small" else echo "Yes! you WIN. That's $NUMBER." break fi done
註意:在此類循環結構中,需要適當的添加continue或break控制語句,以使得無限循環可控;
2.實現遍歷功能的while和until循環結構:
while read LINES ; do
COMMANDS
done < /PATH/FROM/SOMEFILE
until ! read LINES ; do
COMMANDS
done < /PATH/FROM/SOMEFILE
註意:在做遍歷循環時,建議使用for;
select循環結構
select: select NAME [in WORDS ... ;] do COMMANDS; done
Select words from a list and execute commands.
select循環也是一種遍歷列表的方式創建一個可視化菜單,每個列表項都有一個數字編號與之對應,供用戶選擇使用;而用戶只需要選擇其編號即可;
select是一種默認無限循環結構,因此,必須在循環體中為select提供退出循環的條件,通常可以使用break或exit命令實現;
通常情況下,select循環會和case一起使用,已進行合理的取值判斷;
在腳本中實現的格式:
select VAR_NAME in LIST ; do
COMMANDS
done
寫一個腳本,顯示以/bin/bash為默認shell的用戶的ID信息;
#!/bin/bash # #挑選用戶名或者quit退出按鈕 select I in $(awk -F : '/\/bin\/bash$/{print $1}' /etc/passwd) quit ; do case $I in quit) exit ;; *) echo "The UID of $I is $(id -u $I)" ;; esac done
bash中while,until,case,select語句結構