1. 程式人生 > >bash指令碼程式設計-until、continue、break、while特殊用法、for特殊用法

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