日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【转】shell之for、while、until循环

發(fā)布時(shí)間:2024/4/15 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【转】shell之for、while、until循环 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

?一、簡(jiǎn)介

? ??? Shell編程中循環(huán)命令用于特定條件下決定某些語句重復(fù)執(zhí)行的控制方式,有三種常用的循環(huán)語句:for、while和until。while循環(huán)和for循環(huán)屬于“當(dāng)型循環(huán)”,而until屬于“直到型循環(huán)”。循環(huán)控制符:break和continue控制流程轉(zhuǎn)向。

二、詳解
1、for循環(huán)
(1)for循環(huán)有三種結(jié)構(gòu):一種是列表for循環(huán),第二種是不帶列表for循環(huán)。第三種是類C風(fēng)格的for循環(huán)。

(2)列表for循環(huán)

#!/bin/bashfor varible1 in {1..5} #for varible1 in 1 2 3 4 5 doecho "Hello, Welcome $varible1 times " done
  • do和done之間的命令稱為循環(huán)體,執(zhí)行次數(shù)和list列表中常數(shù)或字符串的個(gè)數(shù)相同。for循環(huán),首先將in后list列表的第一個(gè)常數(shù)或字符串賦值給循環(huán)變量,然后執(zhí)行循環(huán)體,以此執(zhí)行l(wèi)ist,最后執(zhí)行done命令后的命令序列。
  • Sheel支持列表for循環(huán)使用略寫的計(jì)數(shù)方式,1~5的范圍用{1..5}表示(大括號(hào)不能去掉,否則會(huì)當(dāng)作一個(gè)字符串處理)。
  • Sheel中還支持按規(guī)定的步數(shù)進(jìn)行跳躍的方式實(shí)現(xiàn)列表for循環(huán),例如計(jì)算1~100內(nèi)所有的奇數(shù)之和。??????
#!/bin/bash sum=0for i in {1..100..2} dolet "sum+=i" doneecho "sum=$sum"

? 通過i的按步數(shù)2不斷遞增,計(jì)算sum值為2500。同樣可以使用seq命令實(shí)現(xiàn)按2遞增來計(jì)算1~100內(nèi)的所有奇數(shù)之和,for i in $(seq 1 2 100),seq表示起始數(shù)為1,跳躍的步數(shù)為2,結(jié)束條件值為100。

  • for循環(huán)對(duì)字符串進(jìn)行操作,例如通過for循環(huán)顯示當(dāng)前目錄下所有的文件。
#!/bin/bashfor file in $( ls ) #for file in * doecho "file: $file" done

也可一使用for file in *,通配符*產(chǎn)生文件名擴(kuò)展,匹配當(dāng)前目錄下的所有文件。

  • for通過命令行來傳遞腳本中for循環(huán)列表參數(shù)
#!/bin/bashecho "number of arguments is $#"echo "What you input is: "for argument in "$@" doecho "$argument" done

$#表示參數(shù)的個(gè)數(shù),$@表示參數(shù)列表而$*則把所有的參數(shù)當(dāng)作一個(gè)字符串顯示。

(3)不帶列表for循環(huán)

由用戶制定參數(shù)和參數(shù)的個(gè)數(shù),與上述的for循環(huán)列表參數(shù)功能相同。

#!/bin/bashecho "number of arguments is $#"echo "What you input is: "for argument doecho "$argument" done

比上述代碼少了$@參數(shù)列表,$*參數(shù)字符串。

(4)類C風(fēng)格的for循環(huán)

也被稱為計(jì)次循環(huán)

#!/bin/bash for((integer = 1; integer <= 5; integer++)) doecho "$integer" done

for中第一個(gè)表達(dá)式(integer = 1)是循環(huán)變量賦初值的語句,第二個(gè)表達(dá)式(integer <= 5)決定是否進(jìn)行循環(huán)的表達(dá)式,退出狀態(tài)為非0時(shí)將退出for循環(huán)執(zhí)行done后的命令(與C中的for循環(huán)條件是剛好相反的)。第三個(gè)表達(dá)式(integer++)用于改變循環(huán)變量的語句。

????? Sheel中不運(yùn)行使用非整數(shù)類型的數(shù)作為循環(huán)變量,循環(huán)條件被忽略則默認(rèn)的退出狀態(tài)是0,for((;;))為死循環(huán)。

?????? 類C的for循環(huán)計(jì)算1~100內(nèi)所有的奇數(shù)之和。

#!/bin/bashsum=0for(( i = 1; i <= 100; i = i + 2 )) dolet "sum += i" doneecho "sum=$sum"

2、while循環(huán)

?????? 也稱為前測(cè)試循環(huán)語句,重復(fù)次數(shù)是利用一個(gè)條件來控制是否繼續(xù)重復(fù)執(zhí)行這個(gè)語句。為了避免死循環(huán),必須保證循環(huán)體中包含循環(huán)出口條件即表達(dá)式存在退出狀態(tài)為非0的情況。

(1)計(jì)數(shù)器控制的while循環(huán) 使用(())標(biāo)識(shí)符 ,注意while與括號(hào),括號(hào)與內(nèi)容之間都有空格

#!/bin/bashsum=0i=1while(( i <= 100 )) dolet "sum+=i"let "i += 2" doneecho "sum=$sum"

指定了循環(huán)的次數(shù)500,初始化計(jì)數(shù)器值為1,不斷測(cè)試循環(huán)條件i是否小于等于100。在循環(huán)條件中設(shè)置了計(jì)數(shù)器加2來計(jì)算1~100內(nèi)所有的奇數(shù)之和。

(2)結(jié)束標(biāo)記控制的while循環(huán)

設(shè)置一個(gè)特殊的數(shù)據(jù)值(結(jié)束標(biāo)記)來結(jié)束while循環(huán)。

#!/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)標(biāo)志控制的while循環(huán),注意while與括號(hào),括號(hào)與內(nèi)容之間都有空格

???? 使用用戶輸入的標(biāo)志值來控制循環(huán)的結(jié)束(避免不知道循環(huán)結(jié)束標(biāo)志的條件)。

#!/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

標(biāo)志控制的while循環(huán)求1~n的累加和,循環(huán)變量值小于100執(zhí)行else累加同時(shí)循環(huán)變量加1,直到循環(huán)變量值等于100將標(biāo)志值設(shè)置為1,并輸出。

? ? ??標(biāo)志控制的while循環(huán)與結(jié)束標(biāo)記控制的while循環(huán)的區(qū)別是用戶無法確定無法確定結(jié)束標(biāo)志,只能程序運(yùn)行后確定結(jié)束標(biāo)志。兩者也可以相互轉(zhuǎn)化。

(4)命令行控制的while循環(huán)
????? 使用命令行來指定輸出參數(shù)和參數(shù)個(gè)數(shù),通常與shift結(jié)合使用,shift命令使位置變量下移一位($2代替$1、$3代替$2,并使$#變量遞減),當(dāng)最后一個(gè)參數(shù)顯示給用戶,$#會(huì)等于0,$*也等于空。

#!/bin/bashecho "number of arguments is $#"echo "What you input is: "while [[ "$*" != "" ]] doecho "$1"shift done

循環(huán)條件可以改寫為while[[ "$#" -ne 0 ]],等于0時(shí)退出while循環(huán)

3、until循環(huán)
????? until命令和while命令類似,while能實(shí)現(xiàn)的腳本until同樣也可以實(shí)現(xiàn),但區(qū)別是until循環(huán)的退出狀態(tài)是不為0,退出狀態(tài)是為0(與while剛好相反),即whie循環(huán)在條件為真時(shí)繼續(xù)執(zhí)行循環(huán)而until則在條件為假時(shí)執(zhí)行循環(huán)。

#!/bin/bashi=0until [[ "$i" -gt 5 ]] ? ?#大于5 dolet "square=i*i"echo "$i * $i = $square"let "i++" done

4、循環(huán)嵌套

一個(gè)循環(huán)體內(nèi)又包含另一個(gè)完整的循環(huán)結(jié)構(gòu),在外部循環(huán)的每次執(zhí)行過程中都會(huì)觸發(fā)內(nèi)部循環(huán),for、while、until可以相互嵌套。

(1)嵌套循環(huán)實(shí)現(xiàn)九九乘法表

#!/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循環(huán)嵌套實(shí)現(xiàn)*圖案排列

#!/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循環(huán)嵌套了兩個(gè)內(nèi)層while循環(huán),先打印空格在打印*號(hào)形成圖案。


5、循環(huán)控制符break和continue
若須退出循環(huán)可使用break循環(huán)控制符,若退出本次循環(huán)執(zhí)行后繼續(xù)循環(huán)可使用continue循環(huán)控制符。

(1)break

??? 在for、while和until循環(huán)中break可強(qiáng)行退出循環(huán),break語句僅能退出當(dāng)前的循環(huán),如果是兩層循環(huán)嵌套,則需要在外層循環(huán)中使用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中用于讓腳本跳過其后面的語句,執(zhí)行下一次循環(huán)。continue用于顯示100內(nèi)能被7整除的數(shù)。

#!/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個(gè)數(shù)字換一行if [ "$temp2" -eq 0 ]thenecho ""filet "m++" done

6、select結(jié)構(gòu)

????? select結(jié)構(gòu)從技術(shù)角度看不能算是循環(huán)結(jié)構(gòu),只是相似而已,它是bash的擴(kuò)展結(jié)構(gòu)用于交互式菜單顯示,功能類似于case結(jié)構(gòu)比case的交互性要好。

(1)select帶參數(shù)列表

#!/bin/bashecho "What is your favourite color? "select color in "red" "blue" "green" "white" "black" do break doneecho "You have selected $color"

(2)select不帶參數(shù)列表

該結(jié)構(gòu)通過命令行來傳遞參數(shù)列表,由用戶自己設(shè)定參數(shù)列表。

#!/bin/bashecho "What is your favourite color? "select color do break doneecho "You have selected $color"

三、總結(jié)

(1)循環(huán)結(jié)構(gòu)中相互嵌套組成更復(fù)雜的流程,并結(jié)合break和continue可以實(shí)現(xiàn)很多復(fù)雜的運(yùn)算。

(2)可以結(jié)合其他語言的語法有助于更好的理解循環(huán)結(jié)構(gòu)。

(3)熟練應(yīng)用還需要大量的重復(fù)練習(xí),重寫優(yōu)秀的shell代碼也是一種很好的方式。

?(以上轉(zhuǎn)自https://blog.csdn.net/taiyang1987912/article/details/38929069)

?

轉(zhuǎn)載于:https://www.cnblogs.com/yanwuliu/p/9997785.html

總結(jié)

以上是生活随笔為你收集整理的【转】shell之for、while、until循环的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。