【转】shell之for、while、until循环
?一、簡介
? ??? Shell編程中循環命令用于特定條件下決定某些語句重復執行的控制方式,有三種常用的循環語句:for、while和until。while循環和for循環屬于“當型循環”,而until屬于“直到型循環”。循環控制符:break和continue控制流程轉向。
二、詳解
1、for循環
(1)for循環有三種結構:一種是列表for循環,第二種是不帶列表for循環。第三種是類C風格的for循環。
(2)列表for循環
#!/bin/bashfor varible1 in {1..5} #for varible1 in 1 2 3 4 5 doecho "Hello, Welcome $varible1 times " done- do和done之間的命令稱為循環體,執行次數和list列表中常數或字符串的個數相同。for循環,首先將in后list列表的第一個常數或字符串賦值給循環變量,然后執行循環體,以此執行list,最后執行done命令后的命令序列。
- Sheel支持列表for循環使用略寫的計數方式,1~5的范圍用{1..5}表示(大括號不能去掉,否則會當作一個字符串處理)。
- Sheel中還支持按規定的步數進行跳躍的方式實現列表for循環,例如計算1~100內所有的奇數之和。??????
? 通過i的按步數2不斷遞增,計算sum值為2500。同樣可以使用seq命令實現按2遞增來計算1~100內的所有奇數之和,for i in $(seq 1 2 100),seq表示起始數為1,跳躍的步數為2,結束條件值為100。
- for循環對字符串進行操作,例如通過for循環顯示當前目錄下所有的文件。
也可一使用for file in *,通配符*產生文件名擴展,匹配當前目錄下的所有文件。
- for通過命令行來傳遞腳本中for循環列表參數
$#表示參數的個數,$@表示參數列表而$*則把所有的參數當作一個字符串顯示。
(3)不帶列表for循環
由用戶制定參數和參數的個數,與上述的for循環列表參數功能相同。
#!/bin/bashecho "number of arguments is $#"echo "What you input is: "for argument doecho "$argument" done比上述代碼少了$@參數列表,$*參數字符串。
(4)類C風格的for循環
也被稱為計次循環
#!/bin/bash for((integer = 1; integer <= 5; integer++)) doecho "$integer" donefor中第一個表達式(integer = 1)是循環變量賦初值的語句,第二個表達式(integer <= 5)決定是否進行循環的表達式,退出狀態為非0時將退出for循環執行done后的命令(與C中的for循環條件是剛好相反的)。第三個表達式(integer++)用于改變循環變量的語句。
????? Sheel中不運行使用非整數類型的數作為循環變量,循環條件被忽略則默認的退出狀態是0,for((;;))為死循環。
?????? 類C的for循環計算1~100內所有的奇數之和。
#!/bin/bashsum=0for(( i = 1; i <= 100; i = i + 2 )) dolet "sum += i" doneecho "sum=$sum"2、while循環
?????? 也稱為前測試循環語句,重復次數是利用一個條件來控制是否繼續重復執行這個語句。為了避免死循環,必須保證循環體中包含循環出口條件即表達式存在退出狀態為非0的情況。
(1)計數器控制的while循環 使用(())標識符 ,注意while與括號,括號與內容之間都有空格
#!/bin/bashsum=0i=1while(( i <= 100 )) dolet "sum+=i"let "i += 2" doneecho "sum=$sum"指定了循環的次數500,初始化計數器值為1,不斷測試循環條件i是否小于等于100。在循環條件中設置了計數器加2來計算1~100內所有的奇數之和。
(2)結束標記控制的while循環
設置一個特殊的數據值(結束標記)來結束while循環。
#!/bin/bashecho "Please input the num(1-10) " read numwhile [[ "$num" != 4 ]] do if [ "$num" -lt 4 ]thenecho "Too small. Try again!"read numelif [ "$num" -gt 4 ]thenecho "To high. Try again" read numelseexit 0fi done echo "Congratulation, you are right! " #!/bin/bashecho "Please input the num " read numfactorial=1while [ "$num" -gt 0 ] dolet "factorial= factorial*num"let "num--" doneecho "The factorial is $factorial"(3)標志控制的while循環,注意while與括號,括號與內容之間都有空格
???? 使用用戶輸入的標志值來控制循環的結束(避免不知道循環結束標志的條件)。
#!/bin/bashecho "Please input the num " read numsum=0 i=1signal=0while [[ "$signal" -ne 1 ]] doif [ "$i" -eq "$num" ]then let "signal=1"let "sum+=i"echo "1+2+...+$num=$sum"elselet "sum=sum+i"let "i++"fi done標志控制的while循環求1~n的累加和,循環變量值小于100執行else累加同時循環變量加1,直到循環變量值等于100將標志值設置為1,并輸出。
? ? ??標志控制的while循環與結束標記控制的while循環的區別是用戶無法確定無法確定結束標志,只能程序運行后確定結束標志。兩者也可以相互轉化。
(4)命令行控制的while循環
????? 使用命令行來指定輸出參數和參數個數,通常與shift結合使用,shift命令使位置變量下移一位($2代替$1、$3代替$2,并使$#變量遞減),當最后一個參數顯示給用戶,$#會等于0,$*也等于空。
循環條件可以改寫為while[[ "$#" -ne 0 ]],等于0時退出while循環
3、until循環
????? until命令和while命令類似,while能實現的腳本until同樣也可以實現,但區別是until循環的退出狀態是不為0,退出狀態是為0(與while剛好相反),即whie循環在條件為真時繼續執行循環而until則在條件為假時執行循環。
4、循環嵌套
一個循環體內又包含另一個完整的循環結構,在外部循環的每次執行過程中都會觸發內部循環,for、while、until可以相互嵌套。
(1)嵌套循環實現九九乘法表
#!/bin/bashfor (( i = 1; i <=9; i++ )) dofor (( j=1; j <= i; j++ ))dolet "temp = i * j" echo -n "$i*$j=$temp "done echo "" #output newline done(2)for循環嵌套實現*圖案排列
#!/bin/bashfor ((i=1; i <= 9; i++)) doj=9;while ((j > i))doecho -n " "let "j--"donek=1while ((k <= i))doecho -n "*"let "k++"doneecho "" done外層for循環嵌套了兩個內層while循環,先打印空格在打印*號形成圖案。
5、循環控制符break和continue
若須退出循環可使用break循環控制符,若退出本次循環執行后繼續循環可使用continue循環控制符。
(1)break
??? 在for、while和until循環中break可強行退出循環,break語句僅能退出當前的循環,如果是兩層循環嵌套,則需要在外層循環中使用break。
#!/bin/bashsum=0 for (( i=1; i <= 100; i++)) do let "sum+=i"if [ "$sum" -gt 1000 ]thenecho "1+2+...+$i=$sum"breakfi done(2)continue
在for、while和until中用于讓腳本跳過其后面的語句,執行下一次循環。continue用于顯示100內能被7整除的數。
#!/bin/bashm=1 for (( i=1; i < 100; i++ )) dolet "temp1=i%7" #被7整除if [ "$temp1" -ne 0 ]thencontinuefiecho -n "$i "let "temp2=m%7" #7個數字換一行if [ "$temp2" -eq 0 ]thenecho ""filet "m++" done6、select結構
????? select結構從技術角度看不能算是循環結構,只是相似而已,它是bash的擴展結構用于交互式菜單顯示,功能類似于case結構比case的交互性要好。
(1)select帶參數列表
#!/bin/bashecho "What is your favourite color? "select color in "red" "blue" "green" "white" "black" do break doneecho "You have selected $color"(2)select不帶參數列表
該結構通過命令行來傳遞參數列表,由用戶自己設定參數列表。
#!/bin/bashecho "What is your favourite color? "select color do break doneecho "You have selected $color"三、總結
(1)循環結構中相互嵌套組成更復雜的流程,并結合break和continue可以實現很多復雜的運算。
(2)可以結合其他語言的語法有助于更好的理解循環結構。
(3)熟練應用還需要大量的重復練習,重寫優秀的shell代碼也是一種很好的方式。
?(以上轉自https://blog.csdn.net/taiyang1987912/article/details/38929069)
?
轉載于:https://www.cnblogs.com/yanwuliu/p/9997785.html
總結
以上是生活随笔為你收集整理的【转】shell之for、while、until循环的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Navicat工具里的empty tab
- 下一篇: RouterOS双线进行IP分流上网