shell迴圈文法

來源:互聯網
上載者:User
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 releasePATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/binexport PATHwhile [ "$yn" != "yes" -a "$yn" != "YES" ]do    read -p "Please input yes/YES to stop this program: " yndoneecho "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 releasePATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/binexport PATHuntil [ "$yn" == "yes" -o "$yn" == "YES" ]do    read -p "Please input yes/YES to stop this program: " yndoneecho "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 releasePATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/binexport PATHs=0  # 這是加總的數值變數i=0  # 這是累計的數值,亦即是 1, 2, 3....while [ "$i" != "100" ]do    i=$(($i+1))   # 每次 i 都會添加 1     s=$(($s+$i))  # 每次都會加總一次!doneecho "The result of '1+2+3+...+100' is ==> $s"

 

for...do...done(固定迴圈)

他的文法是:

for var in con1 con2 con3 ...do    程式段done

以上面的例子來說,這個 $var 的變數內容在迴圈工作時:

  1. 第一次迴圈時, $var 的內容為 con1 ;
  2. 第二次迴圈時, $var 的內容為 con2 ;
  3. 第三次迴圈時, $var 的內容為 con3 ;
  4. ....

我們可以做個簡單的練習。假設我有三種動物,分別是 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 releasePATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/binexport PATHfor animal in dog cat elephantdo    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 releasePATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/binexport PATHnetwork="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."        fidone

 

我想要讓使用者輸入某個目錄檔名, 然後我找出某目錄內的檔名的許可權,該如何是好?

[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 releasePATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/binexport PATH# 1. 先看看這個目錄是否存在啊?read -p "Please input a directory: " dirif [ "$dir" == "" -o ! -d "$dir" ]; then    echo "The $dir is NOT exist in your system."    exit 1fi# 2. 開始測試檔案羅~filelist=$(ls $dir)        # 列出所有在該目錄下的檔案名稱for filename in $filelistdo    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 releasePATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/binexport PATHread -p "Please input a number, I will count for 1+2+...+your_input: " nus=0for (( i=1; i<=$nu; i=i+1 ))do    s=$(($s+$i))doneecho "The result of '1+2+3+...+$nu' is ==> $s"

 

轉自 http://vbird.dic.ksu.edu.tw/linux_basic/0340bashshell-scripts_5.php#loop

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.