保持你的循環(huán)——Bash For、While、Until 循環(huán)示例

      網(wǎng)友投稿 1255 2025-03-31

      循環(huán)語句用于強制程序重復(fù)執(zhí)行語句,執(zhí)行的語句稱為循環(huán)體。

      循環(huán)一直執(zhí)行,直到控制表達(dá)式的值為 0。控制表達(dá)式可以是任何標(biāo)量數(shù)據(jù)類型。

      shell 語言還提供了幾個迭代或循環(huán)語句。在本文中,讓我們通過一些示例來了解 bash 提供的循環(huán)語句。

      Bash 支持以下三種循環(huán)語句

      for循環(huán)

      While 循環(huán)

      Until

      循環(huán)可以嵌套。與任何其他編程語言一樣,bash 也支持 break 語句退出當(dāng)前循環(huán),并支持 continue 語句恢復(fù)循環(huán)語句的下一次迭代。

      Bash For 循環(huán) – 第一種方法

      當(dāng)在進(jìn)入 bash 循環(huán)之前知道迭代次數(shù)時,通常使用 for 循環(huán)。Bash 支持兩種 for 循環(huán)。bash for 循環(huán)的第一種形式是:

      for varname in list do commands ##Body of the loop done

      在上面的語法中:

      for、in、do 和 done 是關(guān)鍵字

      列表是具有項目列表的任何列表

      varname 是任何 Bash 變量名。

      在這種形式中,for 語句執(zhí)行包含在正文中的命令,對列表中的每個項目執(zhí)行一次。每次循環(huán)時,列表 中的當(dāng)前項目都將存儲在變量“varname”中。這個 varname 可以在循環(huán)體中處理。此列表可以是一個變量,其中包含由空格分隔的多個單詞。如果 for 語句中缺少 list,則它采用傳遞給 shell 的位置參數(shù)。

      Bash For Loop 示例 1. 解壓所有 Zip 文件

      以下示例在根目錄中查找與“*.zip*”匹配的文件列表,并在該 zip 文件所在的相同位置創(chuàng)建一個新目錄,并解壓縮該 zip 文件內(nèi)容。

      # cat zip_unzip.sh #! /bin/bash # Find files which has .zip for file in `find /root -name "*.zip*" -type f` do # Skip the extension .zip dirname=`echo ${file} | awk -F'.' '{print }'` # Create the directory mkdir $dirname # Copy the zip file cp ${file} ${dirname} cd $dirname # Unzip the zip file from newly created directory unzip ${dirname}/$(echo ${file##/*/}) done

      在此示例中,find 命令返回文件列表,其中每個文件都將通過循環(huán)進(jìn)行處理。

      對于每個項目,它都會使用 zip 文件的名稱創(chuàng)建目錄,并將 zip 文件復(fù)制到新創(chuàng)建的目錄并從那里解壓縮 zip 文件。

      echo 語句 echo ${file##/*/} 只給你文件名而不是路徑。

      # ./zip_unzip.sh Archive: /root/test2/test2.zip extracting: t1/p extracting: t1/q extracting: t1/r extracting: t1/s extracting: t1/t extracting: t1/u extracting: t1/v Archive: /root/test1/test1.zip extracting: t/a extracting: t/b extracting: t/c extracting: t/d extracting: t/e

      與 Bash 循環(huán)類似,Awk 還提供了我們在Awk While 和 For 循環(huán)文章中討論的 for 循環(huán)和 while 循環(huán)。

      Bash For 循環(huán) – 第二種方法

      for循環(huán)的第二種形式類似于'C'編程語言中的for循環(huán),它具有三個表達(dá)式(初始化、條件和更新)。

      for (( expr1; expr2; expr3 )) do commands done

      在上面的 bash for 命令語法中,在第一次迭代之前, expr1 被評估。這通常用于初始化循環(huán)的變量。

      do 和 done 之間的所有語句都會重復(fù)執(zhí)行,直到 expr2 的值為 TRUE。

      在循環(huán)的每次迭代之后,都會評估 expr3。這通常用于增加循環(huán)計數(shù)器。

      以下示例生成 n 個隨機數(shù)。

      Bash 示例 2. 生成 n 個隨機數(shù)

      $ cat random.sh #! /bin/bash echo -e "How many random numbers you want to generate" read max for (( start = 1; start <= $max; start++ )) do echo -e $RANDOM done $ ./random.sh How many random numbers you want to generate 5 6119 27200 1998 12097 9181

      在上面的代碼片段中,for 循環(huán)以最大次數(shù)生成隨機數(shù)。RANDOM 是一個內(nèi)部 bash 函數(shù),它在每次調(diào)用時返回一個隨機整數(shù)。

      Bash While 循環(huán)

      Shell 編程語言提供的另一個迭代語句是 while 語句。

      Syntax: while expression do commands done

      在上面的while循環(huán)語法中:

      while、do、done 是關(guān)鍵字

      表達(dá)式是返回標(biāo)量值的任何表達(dá)式

      While 語句導(dǎo)致在提供的條件表達(dá)式為真時執(zhí)行代碼塊。

      Bash While 示例 3. 將內(nèi)容寫入文件

      保持你的循環(huán)——Bash For、While、Until 循環(huán)示例

      以下示例從標(biāo)準(zhǔn)輸出讀取數(shù)據(jù)并寫入文件。

      $ cat writefile.sh #! /bin/bash echo -e "Enter absolute path of the file name you want to create" read file while read line do echo $line >> $file done $ sh writefile.sh Enter absolute path of the file name you want to create /tmp/a while for until $ cat /tmp/a while for until

      上面的例子,從用戶那里讀取文件名,并從標(biāo)準(zhǔn)輸入讀取數(shù)據(jù)行并將每一行附加到給定的文件名。當(dāng)EOF進(jìn)入時,讀取會失敗,所以循環(huán)到此結(jié)束。

      如果您正在編寫大量 bash 腳本,您可以使用 Vim 編輯器作為 Bash IDE,使用我們之前討論的Vim bash-support 插件。

      Bash While 示例 4. 讀取文件的內(nèi)容

      在前面的示例中,它從 stdout 讀取數(shù)據(jù)并將其寫入文件。在此示例中,它讀取文件

      內(nèi)容并將其寫入標(biāo)準(zhǔn)輸出。

      $ cat read.sh #! /bin/bash echo -e "Enter absolute path of the file name you want to read" read file exec <$file # redirects stdin to a file while read line do echo $line done $ ./read.sh Enter absolute path of the file name you want to read /tmp/a while for until

      在此示例中,它獲取要讀取的文件名,并使用 exec 將標(biāo)準(zhǔn)輸入重定向到文件。從那時起,所有標(biāo)準(zhǔn)輸入都來自該文件,而不是來自鍵盤。read 命令從標(biāo)準(zhǔn)輸入讀取行,所以 while 循環(huán)讀取標(biāo)準(zhǔn)輸入,直到 EOF 發(fā)生。

      until循環(huán)

      until 語句在語法和功能上與 while 語句非常相似。兩者之間唯一真正的區(qū)別是,當(dāng)條件表達(dá)式為假時,直到語句執(zhí)行其代碼塊,而當(dāng)條件表達(dá)式為真時,while 語句執(zhí)行其代碼塊。

      syntax: until expression do commands #body of the loop done

      在上面的 bash until 語法中:

      where until, do, done 是關(guān)鍵字

      表達(dá)式 任何條件表達(dá)式

      Bash until Example 5. 監(jiān)控日志文件

      此示例監(jiān)視日志文件的大小,一旦日志文件大小達(dá)到 2000 字節(jié),它將獲取該日志文件的副本。

      $ cat monitor.sh file=/tmp/logfile until [ $(ls -l $file | awk '{print $5}') -gt 2000 ] do echo "Sleeping for next 5 seconds" sleep 5 done date=`date +%s` cp $file "$file-"$date.bak $ ./monitor.sh Sleeping for next 5 seconds Sleeping for next 5 seconds $ ls -l /tmp/logfile* -rw-r--r-- 1 sss sss 2010 Jun 24 12:29 logfile -rw-r--r-- 1 sss sss 2005 Jun 24 16:09 logfile-1277474574.bak

      until 語句繼續(xù)執(zhí)行循環(huán)體,直到條件變?yōu)檎妗T诖耸纠校瑮l件是文件大小大于 2000 字節(jié),因此一旦文件達(dá)到 2000 字節(jié),它就會復(fù)制該文件。

      Bash until Example 6. 等待機器啟動

      此示例用于等待機器啟動,然后再對該機器執(zhí)行 ssh。直到循環(huán)語句僅在 ping 給出響應(yīng)時結(jié)束。

      $ cat mac_wait.sh #! /bin/bash read -p "Enter IP Address:" ipadd echo $ipadd until ping -c 1 $ipadd do sleep 60; done ssh $ipadd $./mac_wait.sh Enter IP Address:192.143.2.10 PING 192.143.2.10 (192.143.2.10) 56(84) bytes of data. --- 192.143.2.10 ping statistics --- 1 packets transmitted, 0 received, 100% packet loss, time 0ms PING 192.143.2.10 (192.143.2.10) 56(84) bytes of data. 64 bytes from 192.143.2.10: icmp_seq=1 ttl=64 time=0.059 ms --- 192.143.2.10 ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 0.059/0.059/0.059/0.000 ms The authenticity of host '192.143.2.10 (192.143.2.10)' can't be established. Are you sure you want to continue connecting (yes/no)? yes

      until循環(huán)在命令行中非常有用,作為等待某些事件發(fā)生的一種方式。

      Bash

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:excel表格邊框線怎么添加
      下一篇:word如何插入換行符
      相關(guān)文章
      国产a v无码专区亚洲av| 亚洲欧洲日产国码高潮αv| 亚洲无人区一区二区三区| 亚洲国产天堂久久久久久| 亚洲AV一区二区三区四区| 亚洲精华国产精华精华液| 亚洲国产精品久久久久秋霞小| 亚洲日本VA午夜在线影院| 自拍偷区亚洲国内自拍| 亚洲色偷偷综合亚洲AV伊人蜜桃| 2020久久精品亚洲热综合一本| 亚洲香蕉久久一区二区 | 亚洲va成无码人在线观看| 亚洲欧洲日韩在线电影| 亚洲午夜成激人情在线影院| 91嫩草亚洲精品| 国产亚洲sss在线播放| 亚洲伊人久久大香线蕉AV| 亚洲人成色777777老人头| 久久久久亚洲精品无码网址色欲| 男人的天堂亚洲一区二区三区 | 亚洲成A人片在线观看无码不卡 | 亚洲av综合色区| 亚洲成人在线网站| 亚洲综合无码一区二区三区| 亚洲伊人久久大香线焦| 伊人久久五月丁香综合中文亚洲| 亚洲无码一区二区三区| 国产亚洲视频在线观看| 伊人婷婷综合缴情亚洲五月| 亚洲高清专区日韩精品| 中文字幕亚洲综合精品一区| 亚洲伊人久久大香线蕉影院| 亚洲人成色4444在线观看| 另类专区另类专区亚洲| 亚洲区小说区激情区图片区| 亚洲高清在线观看| 久久精品国产亚洲AV久 | 亚洲人成网址在线观看| 亚洲制服丝袜一区二区三区| 亚洲国产成人综合精品|