bash指令碼程式設計-until、continue、break、while特殊用法、for特殊用法
bash指令碼程式設計
while CONDITION; do
迴圈體
done
進入條件:CONDITION為true;
退出條件:false
until CONDITION; do
迴圈體
done
進入條件:false
退出條件:true
示例:求100以內所正整數之和;
#!/bin/bash # declare -i i=1 declare -i sum=0 until [ $i -gt 100 ]; do let sum+=$i let i++ done echo "Sum: $sum"
示例:列印九九乘法表
#!/bin/bash # declare -i j=1 declare -i i=1 until [ $j -gt 9 ]; do until [ $i -gt $j ]; do echo -n -e "${i}X${j}=$[$i*$j]\t" let i++ done echo let i=1 let j++ done
迴圈控制語句(用於迴圈體中):
continue [N]:提前結束第N層的本輪迴圈,而直接進入下一輪判斷;
while CONDTIITON1; do
CMD1
...
if CONDITION2; then
continue
fi
CMDn
...
done
break [N]:提前結束迴圈;
while CONDTIITON1; do
CMD1
...
if CONDITION2; then
break
fi
CMDn
...
done
示例1:求100以內所有偶數之和;要求迴圈遍歷100以內的所正整數;
#!/bin/bash # declare -i i=0 declare -i sum=0 until [ $i -gt 100 ]; do let i++ if [ $[$i%2] -eq 1 ]; then continue fi let sum+=$i done echo "Even sum: $sum"
建立死迴圈:
while true; do
迴圈體
done
until false; do
迴圈體
done
示例2:每隔3秒鐘到系統上獲取已經登入的使用者的資訊;如果docker登入了,則記錄於日誌中,並退出;
#!/bin/bash # read -p "Enter a user name: " username while true; do if who | grep "^$username" &> /dev/null; then break fi sleep 3 done echo "$username logged on." >> /tmp/user.log 第二種實現: #!/bin/bash # read -p "Enter a user name: " username until who | grep "^$username" &> /dev/null; do sleep 3 done echo "$username logged on." >> /tmp/user.log
while迴圈的特殊用法(遍歷檔案的每一行):
while read line; do
迴圈體
done < /PATH/FROM/SOMEFILE
依次讀取/PATH/FROM/SOMEFILE檔案中的每一行,且將行賦值給變數line:
示例:找出其ID號為偶數的所有使用者,顯示其使用者名稱及ID號;
#!/bin/bash while read line;do if [ $[`echo $line | cut -d: -f3` % 2] -eq 0 ];then echo -e -n "username: `echo $line | cut -d: -f1`\t" echo "uid: `echo $line | cut -d: -f3 `" fi done < /etc/passwd
for迴圈的特殊格式:
for ((控制變數初始化;條件判斷表示式;控制變數的修正表示式)); do
迴圈體
done
控制變數初始化:僅在執行到迴圈程式碼段時執行一次;
控制變數的修正表示式:每輪迴圈結束會先進行控制變數修正運算,而後再做條件判斷;
示例:求100以內所正整數之和;
#!/bin/bash # declare -i sum=0 for ((i=1;i<=100;i++)); do let sum+=$i done echo "Sum: $sum."
示例2:列印九九乘法表;
#!/bin/bash # for((j=1;j<=9;j++));do for((i=1;i<=j;i++))do echo -e -n "${i}X${j}=$[$i*$j]\t" done echo done
練習:寫一個指令碼,完成如下任務
(1) 顯示一個如下選單:
cpu) show cpu information;
mem) show memory information;
disk) show disk information;
quit) quit
(2) 提示使用者選擇選項;
(3) 顯示使用者選擇的內容;
#!/bin/bash # cat << EOF cpu) show cpu information; mem) show memory information; disk) show disk information; quit) quit ============================ EOF read -p "Enter a option: " option while [ "$option" != 'cpu' -a "$option" != 'mem' -a "$option" != 'disk' -a "$option" != 'quit' ]; do read -p "Wrong option, Enter again: " option done if [ "$option" == 'cpu' ]; then lscpu elif [ "$option" == 'mem' ]; then cat /proc/meminfo elif [ "$option" == 'disk' ]; then fdisk -l else echo "Quit" exit 0 fi
進一步地:
使用者選擇,並顯示完成後不退出指令碼;而是提示使用者繼續選擇顯示其它內容;直到使用quit方始退出;