循環(huán)是 bash 腳本中一個(gè)很重要的功能,用途廣泛。本篇文章我們介紹三種不同的循環(huán),然后利用循環(huán)遍歷數(shù)組。
for 循環(huán)
for 循環(huán)有兩種不同的寫法:
- c 語(yǔ)言樣式的 for 循環(huán);
- 列表中使用的 for 循環(huán)。
c 語(yǔ)言樣式的 for 循環(huán)
如果你熟悉 c 或者 c++等編程語(yǔ)言,那么對(duì)于如下循環(huán)應(yīng)該不會(huì)陌生:
for ((initialize ; condition ; increment)); do
[COMMANDS]
done
根據(jù)上述語(yǔ)法,我們寫一個(gè)例子,打印 Hello Friend 十次:
for ((i = 0 ; i < 10 ; i++)); do
echo "Hello Friend"
done
上述代碼中,首先將整型變量 i 初始化為 0,然后設(shè)置循環(huán)條件(i<10),如果條件為真,則執(zhí)行循環(huán),打印 Hello Friend,并將變量 i 遞增 1,然后進(jìn)行下一次循環(huán),知道 i<10不再滿足。
$ bash hello.sh
Hello Friend
Hello Friend
Hello Friend
Hello Friend
Hello Friend
Hello Friend
Hello Friend
Hello Friend
Hello Friend
Hello Friend
列表中使用的 for 循環(huán)
列表循環(huán)是 for 循環(huán)的一種變體,這在處理列表或者數(shù)組的時(shí)候特別方便,其語(yǔ)法如下:
for item in [LIST]; do
[COMMANDS]
done
比如,我們重寫一下上面的那個(gè)例子:
for i in {1..10}; do
echo "Hello Friend"
done
另一個(gè)例子,下面腳本 var.sh 將打印在 /var 目錄下的所有文件和目錄:
#!/bin/bash
for i in /var/*; do
echo $i
done
執(zhí)行一下,其輸出如下:
$ ./var.sh
/var/backups
/var/cache
/var/crash
/var/lib
/var/local
/var/lock
/var/log
/var/mail
/var/metrics
/var/opt
/var/run
/var/snap
/var/spool
/var/tmp
while 循環(huán)
while 循環(huán)是 bash 中另一個(gè)應(yīng)用很廣泛的循環(huán),其語(yǔ)法如下:
while [ condition ]; do
[COMMANDS]
done
作為演示,我創(chuàng)建一個(gè)名為 3x10.sh 的腳本,用于打印前10個(gè)3的倍數(shù):
#!/bin/bash
num=1
while [ $num -le 10 ]; do
echo $(($num * 3))
num=$(($num+1))
done
其執(zhí)行結(jié)果如下:
$ ./3x10.sh
3
6
9
12
15
18
21
24
27
30
上述腳本中,首先將變量 num 初始化為 1,然后設(shè)定循環(huán)條件為 num 小于或等于 10。在循環(huán)體中,打印 num 乘以 3,然后將 num 遞增 1。
until 循環(huán)
如果你有 c/c++ 編程背景,那你可能會(huì)不自覺的找 do-while 循環(huán)。但是,在 bash 中并不存在 do-while 循環(huán)。
bush 中存在另一種循環(huán),即 until 循環(huán),其與 while 循環(huán)具有相同的語(yǔ)法:
until [ condition ]; do
[COMMANDS]
Done
until 循環(huán)與 while 循環(huán)之間的主要區(qū)別在于循環(huán)條件。當(dāng)循環(huán)條件為真時(shí),while 循環(huán)會(huì)繼續(xù),但是,當(dāng)循環(huán)條件為假時(shí),until 循環(huán)才會(huì)繼續(xù)。
比如上面我們寫的 3x10.sh 腳本,我們使用 until 循環(huán)來(lái)實(shí)現(xiàn),如下:
#!/bin/bash
num=1
until [ $num -gt 10 ]; do
echo $(($num * 3))
num=$(($num+1))
done
大家應(yīng)該可以注意到,上面的循環(huán)條件為 $num -gt 10,為前一個(gè)例子中 -le 的否定。
循環(huán)的具體應(yīng)用
上面我們介紹了 bash 中循環(huán)的用法,下面在實(shí)際例子中介紹一下循環(huán)的使用。
打印數(shù)組的內(nèi)容
在此之前,我們假定大家了解 bash 中的數(shù)組。
遍歷數(shù)組,for 循環(huán)通常是最首要的選擇。
如下腳本 prime.sh 中,將會(huì)遍歷并打印出數(shù)組中的所有元素:
#!/bin/bash
prime=(2 3 5 7 11 13 17 19 23 29)
for i in "${prime[@]}"; do
echo $i
done
執(zhí)行一下,結(jié)果如下:
$ ./prime.sh
2
3
5
7
11
13
17
19
23
29
在循環(huán)中使用 break 和 continue
有時(shí)候我們可能希望提前退出循環(huán),或者跳過(guò)本次循環(huán)。那么此時(shí)需要分別使用 break 和 continue。
break 將會(huì)終止循環(huán),并將程序控制轉(zhuǎn)到循環(huán)后的下一個(gè)命令或指令。
比如,下面的循環(huán)只會(huì)打印從 1 到 3:
for ((i=1;i<=10;i++)); do
echo $i
if [ $i -eq 3 ]; then
break
fi
done
使用 continue 語(yǔ)句會(huì)跳過(guò)本次循環(huán),繼續(xù)執(zhí)行下次循環(huán)。比如,下面腳本 odd.sh 只會(huì)打印從 1 到 10 之間的奇數(shù),而跳過(guò)偶數(shù):
#!/bin/bash
for ((i=0;i<=10;i++)); do
if [ $(($i % 2)) -ne 1 ]; then
continue
fi
echo $i
done
執(zhí)行結(jié)果如下:
$ ./odd.sh
1
3
5
7
9
無(wú)限循環(huán)
無(wú)限循環(huán)是一個(gè)永遠(yuǎn)運(yùn)行的循環(huán),其循環(huán)條件始終為真。大多數(shù)情況下,無(wú)限循環(huán)是因?yàn)檫壿嬪e(cuò)誤造成的bug。
例如,有人可能希望創(chuàng)建一個(gè)循環(huán),以降序打印數(shù)字1到10,結(jié)果可能會(huì)錯(cuò)誤地創(chuàng)建以下無(wú)限循環(huán):
for ((i=10;i>0;i++)); do
echo $i
done
上述錯(cuò)誤是將 i 遞增 1。要修復(fù)這個(gè)問題需要將遞增改為遞減 i--:
for ((i=10;i>0;i--)); do
echo $i
done
在某些情況下,我們可能希望有意創(chuàng)建無(wú)限循環(huán),以等待系統(tǒng)滿足外部條件。如下所示:
for ((;;)); do
[COMMANDS]
done
如果想要?jiǎng)?chuàng)建一個(gè)無(wú)限 while 循環(huán),可參考如下:
while [ true ]; do
[COMMANDS]
done
-
C語(yǔ)言
+關(guān)注
關(guān)注
180文章
7594瀏覽量
135857 -
循環(huán)
+關(guān)注
關(guān)注
0文章
92瀏覽量
15947 -
腳本
+關(guān)注
關(guān)注
1文章
387瀏覽量
14811 -
Bash
+關(guān)注
關(guān)注
0文章
57瀏覽量
10161
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論