標籤:declare let linux until while
一、while的文法格式
二、until的文法格式
三、樣本與練習
四、補充
一、while的文法格式
------------------------------------------
while 測試條件; do
語句1
語句2
······
done
------------------------------------------
條件滿足時就迴圈,直到條件不滿足,則退出迴圈
退出迴圈的方法之一:在迴圈體中改變測試條件相應變數的值,如樣本1中,$I的值大於100則退出迴圈
常用於遍曆檔案每一行內容,如樣本3
while read LINE; do
語句1
語句2
······
done < /path/to/somefile
二、until的文法格式
------------------------------------------
until 測試條件;do
語句1
語句2
······
done
------------------------------------------
條件不滿足就迴圈,直到滿足時退出迴圈,例如樣本5,直到I大於100時,退出迴圈
三、樣本與練習
樣本1:計算100以內所有正整數的和
#!/bin/bash#Sum=0 #如果希望變數中儲存的值為整數型,最好使用let Sum=0或declare -i Sum=0這種形式I=1while [ $I -le 100 ];do let Sum+=$I #算術運算寫成這種格式要注意不要漏掉let let I++ #算術運算寫成這種格式要注意不要漏掉letdoneecho "Sum:$Sum"
樣本2:計算100以內所有偶數的和
#!/bin/bash#EvenSum=0 #如果希望變數中儲存的值為整數型,最好使用let EvenSum=0或declare -i EvenSum=0這種形式I=0while [ $I -le 100 ]; do let EvenSum+=$I let I++ let I++doneecho "EvenSum:$EvenSum"或#!/bin/bash#EvenSum=0I=0while [ $I -le 100 ]; do if [ $[$I%2] -eq 0 ]; then #除二取餘為0時 let EvenSum+=$I fi let I++done
樣本3:如果使用者的ID號為偶數,則顯示其名稱和shell;對所有使用者執行此操作
#!/bin/bash#while read Line; do Uid=`echo $Line | cut -d: -f3` if [ $[$Uid%2] -eq 0 ]; then #除二取餘為0時 echo $Line | cut -d: -f3,7 fidone < /etc/passwd #此時while語句實現了一行一行遍曆整個檔案內容
樣本4:轉換使用者輸入的字元為大寫,輸入quit時則退出
#!/bin/bash#read -p "A string [quit for quiting]:" String while [ "$String" != quit ]; do #一定要用雙引號,字串有空格時會報錯 echo $String | tr ‘a-z‘ ‘A-Z‘ read -p "Next String [quit for quiting]:" Stringdone
樣本5:計算100以內所有正整數的和
#!/bin/bash#Sum=0I=1until [ $I -gt 100 ]; do #直到I的值大於100才退出 let Sum+=$I let I++doneecho "Sum:$Sum"
樣本6:每隔5秒查看hadoop使用者是否登入,如果登入,顯示其登入並退出;否則,顯示目前時間,並說明hadoop尚未登入(while 簡寫)
#!/bin/bash#until who | grep "^hadoop" &> /dev/null; do date sleep 5doneecho "hadoop is logged in."或#!/bin/bash#who | grep "^hadoop" &> /dev/nullRet=$?until [ $Ret -eq 0 ]; do #grep匹配到時,命令執行狀態傳回值是0,未匹配到則是非0 date sleep 5doneecho "hadoop is logged in."或#!/bin/bash#who | grep "^hadoop" &> /dev/nullRet=$?while [ $Ret -ne 0 ]; do date sleep 5 who | grep "^hadoop" &> /dev/null Ret=$? #再次取得命令執行狀態的傳回值 doneecho "hadoop is logged in."
練習1:寫一個指令碼:
1) 顯示一個菜單給使用者:
d|D) show disk usages.
m|M) show memory usages.
s|S) show swap usages.
*) quit.
2) 當使用者選擇完成,顯示相應資訊後,不退出;而讓使用者再一次選擇,再次顯示相應內容;除了使用者使用quit
#!/bin/bash# Date: 2015-04-20# Author: ArvinLau# Description: # Version: 1.0cat << EOF d|D) show disk usages.m|M) show memory usages.s|S) show swap usages.*) quit.EOFRet=0 #自訂退出的命令執行狀態傳回值,通過until語句的直到滿足條件,否則一直迴圈完成練習until [ "$Ret" -eq 9 ];do read -p "Give a choice:" Choice case $Choice in d|D) df -lh;; m|M) free -m;; s|S) cat /proc/swaps;; quit) echo "Quit." exit 9;; #自訂命令執行狀態傳回值 *) echo -n "Invalid input,";; esac Ret=$? #只要不是自訂的9,就會不斷迴圈done或#!/bin/bash# Date: 2015-04-20# Author: ArvinLau# Description: # Version: 1.0cat << EOF d|D) show disk usages.m|M) show memory usages.s|S) show swap usages.*) quit.EOFuntil [ "$Choice" == quit ];do #當變數字串是quit時,退出迴圈 read -p "Give a chioce:" Choice case $Choice in d|D) df -lh;; m|M) free -m;; s|S) cat /proc/swaps;; quit) echo "Quit." exit 9;; *) echo -n "Invalid input,";; esacdone
四、算術運算子
下面每行的運算運算式,運算結果都相同
Sum=$[$Sum+$M] let Sum+=$M
------------------------------------------
Sum=$[$Sum+1] let Sum+=1 let Sum++ #變數自身+1
------------------------------------------
Sum=$[$Sum-$M] let Sum-=$M
------------------------------------------
Sum=$[$Sum*$M] let Sum*=$M
------------------------------------------
Sum=$[$Sum/$M] let Sum/=$M
------------------------------------------
Sum=$[$Sum%$M] let Sum%=$M
本文出自 “Arvin Lau” 部落格,請務必保留此出處http://64314491.blog.51cto.com/2784219/1636240
Linux之while、until語句