while do done, until do done (不定回圈)
一般來說,不定回圈最常見的就是底下這兩種狀態了:
while [ condition ] <==中括號內的狀態就是判斷式 do <==do 是回圈的開始! 程序段落 done <==done 是回圈的結束
while 的中文是『當....時』,所以,這種方式說的是『當 condition 條件成立時,就進行回圈,直到 condition 的條件不成立才停止』的意思。
還有另外一種不定回圈的方式:
until [ condition ] do 程序段落 done
這種方式恰恰與 while 相反,它說的是『當 condition 條件成立時,就終止回圈, 否則就持續進行回圈的程序段。』是否剛好相反啊
我們以 while 來做個簡單的練習好了。 假設我要讓使用者輸入 yes 或者是 YES 才結束程序的運行,否則就一直進行告知使用者輸入字串。
[root@www scripts]# vi sh13.sh #!/bin/bash # Program: # Repeat question until user input correct answer. # History: # 2005/08/29 VBird First release PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin export PATH while [ "$yn" != "yes" -a "$yn" != "YES" ] do read -p "Please input yes/YES to stop this program: " yn done echo "OK! you input the correct answer."
上面這個例題的說明是『當 $yn 這個變量不是 "yes" 且 $yn 也不是 "YES" 時,才進行回圈內的程序。』 而如果 $yn 是 "yes" 或 "YES" 時,就會離開回圈羅~那如果使用 until 呢?呵呵有趣羅~ 他的條件會變成這樣:
[root@www scripts]# vi sh13-2.sh #!/bin/bash # Program: # Repeat question until user input correct answer. # History: # 2005/08/29 VBird First release PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin export PATH until [ "$yn" == "yes" -o "$yn" == "YES" ] do read -p "Please input yes/YES to stop this program: " yn done echo "OK! you input the correct answer."
仔細比對一下這兩個東西有啥不同喔! ^_^再來,如果我想要計算 1+2+3+....+100 這個數據呢? 利用回圈啊~他是這樣的:
[root@www scripts]# vi sh14.sh #!/bin/bash # Program: # Use loop to calculate "1+2+3+...+100" result. # History: # 2005/08/29 VBird First release PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin export PATH s=0 # 這是加總的數值變量 i=0 # 這是累計的數值,亦即是 1, 2, 3.... while [ "$i" != "100" ] do i=$(($i+1)) # 每次 i 都會添加 1 s=$(($s+$i)) # 每次都會加總一次! done echo "The result of '1+2+3+...+100' is ==> $s"
for...do...done(固定循環)
他的語法是:
for var in con1 con2 con3 ... do 程序段 done
以上面的例子來說,這個 $var 的變量內容在回圈工作時:
- 第一次回圈時, $var 的內容為 con1 ;
- 第二次回圈時, $var 的內容為 con2 ;
- 第三次回圈時, $var 的內容為 con3 ;
- ....
我們可以做個簡單的練習。假設我有三種動物,分別是 dog, cat, elephant 三種, 我想每一行都輸出這樣:『There are dogs...』之類的字樣,則可以:
[root@www scripts]# vi sh15.sh #!/bin/bash # Program: # Using for .... loop to print 3 animals # History: # 2005/08/29 VBird First release PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin export PATH for animal in dog cat elephant do echo "There are ${animal}s.... " done
我想要偵測的網域是本機所在的 192.168.1.1~192.168.1.100,由於有 100 台主機, 總不會要我在 for 后面輸入 1 到 100 吧?此時你可以這樣做喔!
[root@www scripts]# vi sh17.sh #!/bin/bash # Program # Use ping command to check the network's PC state. # History # 2009/02/18 VBird first release PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin export PATH network="192.168.1" # 先定義一個網域的前面部分! for sitenu in $(seq 1 100) # seq 為 sequence(連續) 的縮寫之意 do # 底下的程序在取得 ping 的回傳值是正確的還是失敗的! ping -c 1 -w 1 ${network}.${sitenu} &> /dev/null && result=0 || result=1 # 開始顯示結果是正確的啟動 (UP) 還是錯誤的沒有連通 (DOWN) if [ "$result" == 0 ]; then echo "Server ${network}.${sitenu} is UP." else echo "Server ${network}.${sitenu} is DOWN." fi done
我想要讓使用者輸入某個目錄檔名, 然后我找出某目錄內的檔名的權限,該如何是好?
[root@www scripts]# vi sh18.sh #!/bin/bash # Program: # User input dir name, I find the permission of files. # History: # 2005/08/29 VBird First release PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin export PATH # 1. 先看看這個目錄是否存在啊? read -p "Please input a directory: " dir if [ "$dir" == "" -o ! -d "$dir" ]; then echo "The $dir is NOT exist in your system." exit 1 fi # 2. 開始測試文件羅~ filelist=$(ls $dir) # 列出所有在該目錄下的文件名稱 for filename in $filelist do perm="" test -r "$dir/$filename" && perm="$perm readable" test -w "$dir/$filename" && perm="$perm writable" test -x "$dir/$filename" && perm="$perm executable" echo "The file $dir/$filename's permission is $perm " done
for...do...done 的數值處理
除了上述的方法之外,for 回圈還有另外一種寫法!語法如下:
for (( 初始值; 限制值; 運行步階 )) do 程序段 done
這種語法適合於數值方式的運算當中,在 for 后面的括號內的三串內容意義為:
- 初始值:某個變量在回圈當中的起始值,直接以類似 i=1 配置好;
- 限制值:當變量的值在這個限制值的范圍內,就繼續進行回圈。例如 i<=100;
- 運行步階:每作一次回圈時,變量的變化量。例如 i=i+1。
值得注意的是,在『運行步階』的配置上,如果每次添加 1 ,則可以使用類似『i++』的方式,亦即是 i 每次回圈都會添加一的意思。好,我們以這種方式來進行 1 累加到使用者輸入的回圈吧!
[root@www scripts]# vi sh19.sh #!/bin/bash # Program: # Try do calculate 1+2+....+${your_input} # History: # 2005/08/29 VBird First release PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin export PATH read -p "Please input a number, I will count for 1+2+...+your_input: " nu s=0 for (( i=1; i<=$nu; i=i+1 )) do s=$(($s+$i)) done echo "The result of '1+2+3+...+$nu' is ==> $s"
轉自 http://vbird.dic.ksu.edu.tw/linux_basic/0340bashshell-scripts_5.php#loop
