bash中while,until,case,select語句結構
case語句:
在指令碼中使用case結構:
case ${VAR_NAME} in
PATTERN1)
COMMAND
...
;;
PATTERN2)
COMMAND
...
;;
...
esac
PATTERN(模式)可以是下列幾類字元:
1.普通的文本字元
2.Globbing風格的萬用字元:
*:任意長度的任一字元
?:任意單個字元;
[]:指定範圍內的任意單個字元;
[^]:指定範圍以外的任意單個字元;
3.|
或字元
if的多分支結構和case的選擇分支結構的異同:
相同點:
1.判斷的條件為真時,才會執行對應分支中的語句;條件為假,就跳過不執行;
2.都可以設定預設分支語句,即:所有給定的條件的判斷都為假時,才會執行的語句;
不同點:
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
本文永久更新連結地址:https://www.bkjia.com/Linux/2018-03/151446.htm