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方始退出;