保持你的循環(huán)——Bash For、While、Until 循環(huán)示例
循環(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)容寫入文件
以下示例從標(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)容。