1. 程式人生 > >shell指令碼程式設計中for while until三種迴圈的使用方法

shell指令碼程式設計中for while until三種迴圈的使用方法

最後要介紹的是 shell script 設計中常見的"迴圈"(loop)。所謂的 loop 就是 script 中的一段在一定條件下反覆執行的程式碼。
bash shell 中常用的 loop 有如下三種:
* for
* while
* until
for loop 是從一個清單列表中讀進變數值,並"依次"的迴圈執行 do 到 done 之間的命令列。
例:
for var in one two three four five
do
echo -----------
echo '$var is '$var
echo
done
上例的執行結果將會是:
1) for 會定義一個叫 var 的變數,其值依次是 one two three four five 。
2) 因為有 5 個變數值,因此 do 與 done 之間的命令列會被迴圈執行 5 次。
3) 每次迴圈均用 echo 產生三行句子。
而第二行中不在 hard quote 之內的 $var 會依次被替換為 one two three four five 。
4) 當最後一個變數值處理完畢,迴圈結束。
我們不難看出,在 for loop 中,變數值的多寡,決定迴圈的次數。然而,變數在迴圈中是否使用則不一定,得視設計需求而定。倘若 for loop 沒有使用 in 這個 keyword 來指定變數值清單的話,其值將從

[email protected] (或 $* )中繼承:
for var; do
....
done
(若你忘記了 positional parameter ,請溫習第9問...)
for loop 用於處理"清單"(list)專案非常方便,其清單除了可明確指定或從 positional parameter 取得之外, 也可從變數替換或命令替換取得... (再一次提醒:別忘了命令列的"重組"特性﹗) 然而,對於一些"累計變化"的專案(如整數加減),for 亦能處理:
for ((i=1;i<=10;i++))
do
echo "num is $i"
done
除了 for loop ,上面的例子我們也可改用 while loop 來做到:
num=1
while [ "$num" -le 10 ]; do
echo "num is $num"
num=$(($num + 1))
done
while loop 的原理與 for loop 稍有不同:它不是逐次處理清單中的變數值,而是取決於 while 後面的命令列之 return value :
* 若為 ture ,則執行 do 與 done 之間的命令,然後重新判斷 while 後的 return value 。
* 若為 false ,則不再執行 do 與 done 之間的命令而結束迴圈。
分析上例:
1) 在 while 之前,定義變數 num=1 。
2) 然後測試(test) $num 是否小於或等於 10 。
3) 結果為 true ,於是執行 echo 並將 num 的值加一。
4) 再作第二輪測試,其時 num 的值為 1+1=2 ,依然小於或等於 10,因此為 true ,繼續迴圈。
5) 直到 num 為 10+1=11 時,測試才會失敗... 於是結束迴圈。
我們不難發現:
* 若 while 的測試結果永遠為 true 的話,那迴圈將一直永久執行下去:
while :; do
echo looping...
done
上例的" : "是 bash 的 null command ,不做任何動作,除了送回 true 的 return value 。因此這個迴圈不會結束,稱作死迴圈。死迴圈的產生有可能是故意設計的(如跑 daemon),也可能是設計錯誤。若要結束死尋環,可透過 signal 來終止(如按下 ctrl-c )。
(關於 process 與 signal ,等日後有機會再補充,十三問暫時略過。)
一旦你能夠理解 while loop 的話,那,就能理解 until loop :
* 與 while 相反,until 是在 return value 為 false 時進入迴圈,否則結束。
因此,前面的例子我們也可以輕鬆的用 until 來寫:
num=1
until [ ! "$num" -le 10 ]; do
echo "num is $num"
num=$(($num + 1))
done
或是:
num=1
until [ "$num" -gt 10 ]; do
echo "num is $num"
num=$(($num + 1))
done
okay ,關於 bash 的三個常用的 loop 暫時介紹到這裡。
在結束本shell十三問之前,再跟大家補充兩個與 loop 有關的命令:
* break
* continue
這兩個命令常用在複合式迴圈裡,也就是在do ... done之間又有更進一層的 loop,當然,用在單一迴圈中也未嘗不可啦... ^_^
break 是用來打斷迴圈,也就是"強迫結束" 迴圈。若 break 後面指定一個數值 n 的話,則"從裡向外"打斷第 n 個迴圈,預設值為 break 1 ,也就是打斷當前的迴圈。
在使用 break 時需要注意的是, 它與 return 及 exit 是不同的:
* break 是結束 loop
* return 是結束 function
* exit 是結束 script/shell
而 continue 則與 break 相反:強迫進入下一次迴圈動作。若你理解不來的話,那你可簡單的看成:在 continue 到 done 之間的句子略過而返回迴圈頂端...與 break 相同的是:continue 後面也可指定一個數值 n ,以決定繼續哪一層(從裡向外計算)的迴圈,預設值為 continue 1 ,也就是繼續當前的迴圈。
    在 shell script 設計中,若能善用 loop ,將能大幅度提高 script 在複雜條件下的處理能力。
請多加練習吧....

-----------
好了,該是到了結束的時候了。
婆婆媽媽的跟大家囉唆了一堆關於 shell 的基礎概念,
目的不是要告訴大家"答案",而是要帶給大家"啟發"...
在日後關於 shell 的討論中,我或許會經常用"連結"方式指引回來十三問中的內容,
以便我們在進行技術探討時彼此能有一些討論基礎,而不至於各說各話、徒費時力。
但,更希望十三問能帶給你更多的思考與樂趣,至為重要的是透過實作來加深理解。

相關推薦

shell指令碼程式設計for while until迴圈的使用方法

最後要介紹的是 shell script 設計中常見的"迴圈"(loop)。所謂的 loop 就是 script 中的一段在一定條件下反覆執行的程式碼。 bash shell 中常用的 loop 有如下三種: * for * while * until for l

總結Shell指令碼程式設計避免SFTP輸入密碼的方法

最近程式設計中用到sftp上傳檔案,且需要用crontab預設定時上傳事件。而sftp不同於ftp,沒有提供選項如 -i 可以將密碼直接編碼程序序。使用sftp指令,會自動請求使用者輸入密碼。 總結一下可以避免sftp輸入密碼的三種方式: 1. lftp方式 LFTP

OraclePL/SQL之 whilefor、loop 迴圈方式的使用

PL/SQL  while、for、loop 三種迴圈方式的使用 1、WHILE ... LOOP ... END LOOP 語法: WHILE 條件 LOOP 語句; END LOOP; 例子:輸出1到5的數字 declare num number :

shell指令碼檔案for迴圈的兩寫法

#!/bin/bash for (( i = 0; i <= 10; i++ )) ; do echo "The value is: $i" done echo -e "\nJourneys end in lovers' meeting."

詳解java程式設計會遇到的錯誤

1、語法錯 在程式設計和執行的過程中,發生錯誤是不可避免的。 語法錯(編譯錯)違反語法規範的錯誤,通常在編譯時發現。 Java編譯器能夠發現所有語法錯,給出錯誤的位置和性質。 2、語義錯(執行錯) 如果程式在語法上正確,但在語義上存在錯誤。 不能被編譯系統發現,只能到程式執行

c++ STLsort函式的使用方法

複習一下~ STL,C++中的標準模板庫, 使用起來方便並且效率較高; sort函式有三種用法: 一:對基本型別陣列從小到大排序 sort( 陣列名+n1,陣列名+n2); 將陣列中下標從n1到n2的元素進行從小到大排序,不包括n2,通過n1,n2 可以對整

OLE:物件的類沒有在註冊資料庫註冊 問題的解決方法

我在網上下載了破解版的SAS9.3,用了一段時間之後,今天開啟就填出一個提示框: OLE:物件的類沒有在註冊資料庫中註冊  啟用該物件所需的應用程式不可用。是否用“轉換……”將其轉換為或啟用為另一型別

使用迴圈方法編寫等腰梯形圖形

package com.helloworld; public class CycleDemo {public static void main(String[] args) {int o=5;int e=1;int q=5;int v=1;for(o=5;o>=1;o

[Shell]條件判斷與流程控制:if, case, for, while, until

設備 重啟 硬鏈接 HA rpm 套接字 字符串 regular 符號 【條件判斷】 1. 按文件類型進行判斷   -b 文件 判斷該文件是否存在,並且為塊設備文件(是塊設備文件為真)   -c 文件 判斷該文件是否存在,並且為字符設備文件(是字符設

oracle迴圈(ForWhile、Loop)案例

1.ORACLE中的FOR迴圈用法(九九乘法表) 1 declare 2 i int:=0; 3 j int:=0; 4 begin 5 for i in 1..9 loop 6 for j in 1..i loop 7 Dbms_Output.p

Linux命令列與shell指令碼程式設計大全(

十二、呈現資料 輸入和輸出     標準檔案描述符                  0 STDIN 標準輸入   &n

《Linux命令列與shell指令碼程式設計大全》讀書筆記————第章 基本的bash shell命令

本章內容 1、使用shell 2、bash手冊 3、瀏覽檔案系統 4、檔案和目錄列表 5、管理檔案和目錄 6、檢視檔案內容   3.3 bash手冊 命令: man  xterm  作用:檢視檢視xterm使用者手冊 man命

Shell指令碼程式設計

if-else語句 Shell 有三種 if … else 語句: if ... fi 語句; if ... else ... fi 語句; if ... elif ... else ... fi 語句。 if … else 語句的語法: if [ expression

Java筆記3——IDEA軟體的部分快捷鍵 ; for while do...while迴圈結構,if switch選擇語句

學習Java程式設計,IntelliJ IDEA是一個很智慧,幫助你更快的編寫程式的軟體;具體此軟體的安裝以及破解教程,我就不再贅述了,在官網上,一些部落格上大家都可以搜到,我主要來分享下在此軟體中常用的一些快捷鍵: 1.輸入psvm可以提供public sta

Shell指令碼程式設計之()執行方式差異(source, sh script, ./script)

利用直接方式或bash執行 該 指令碼 都會使用一個新的 bash 環境來執行指令碼內的指令!也就是說,使用這種執行方式時, 其實 script 是在子程式的 bash 內執行的 知識點 當子程式完成後,在子程式內的各項變數或動作將會結束而不會傳回到父程式中

《linux命令列與shell指令碼程式設計大全》第

《linux命令列與shell指令碼程式設計大全》 全書4部分:☆ 【1】linux命令列(1-10章)☆ 【2】shell指令碼程式設計基礎(11-16章)☆ 【3】高階shell指令碼程式設計(17-23章):正則表示式☆ 【4】建立實用的指令碼(24-26章)>

shell指令碼呼叫另一個指令碼不同方法

1、fork (fork /directory/script.sh) fork是最普通的, 就是直接在腳本里面用/directory/script.sh來呼叫script.sh這個指令碼. 執行的時候開一個sub-shell執行呼叫的指令碼,sub-she

shell指令碼呼叫另一個指令碼不同方法(fork, exec, source)

fork fork(fork /directory/script.sh)如果shell中包含執行命令,那麼子命令並不影響父級的命令,在子命令執行完後再執行父級命令。子級的環境變數不會影響到父級。 fork是最普通的, 就是直接在腳本里面用/directory

Linux shell指令碼程式設計-將一行的某個部分去重

一,背景。 今天遇到了一個使用場景,獲取檔案中每一行的某個屬性資料,然後將該屬性資料去重。 二,shell指令碼編寫。 bash 1 #!/bin/bash 2 for line in `cat test1|awk -F "|"

建立shell指令碼,利用for迴圈箱向日志文件插入n條資料

使用shell文字編輯器,建立一個for.sh的指令碼文件。命令為"nano for.sh" 2 shell中for迴圈的第一種寫法,“ for  i in `ls`;