Bash 基礎(chǔ)知識系列 #8:For、While 和 Until 循環(huán)
循環(huán)是任何編程語言中的一個強(qiáng)大功能。如果你還不知道,循環(huán)其實(shí)是一種根據(jù)某些條件重復(fù)代碼的方式。
例如,想象一下你需要打印從 1 到 10 的數(shù)字。你可以使用 echo
命令寫十次,但那太原始了。你使用一個循環(huán),在 3 到 4 行代碼內(nèi),就能完成。
這是我能想到的最簡單的例子。我將在討論 Bash 循環(huán)時,分享一些實(shí)際有用的例子。
在 Bash 中有三種類型的循環(huán):
for
while
until
我將在教程中展示所有三種類型的循環(huán)。讓我們從最常見的一種開始。
Bash 中的 For 循環(huán)
以下是 Bash 中的 for
循環(huán)語法:
for arg in LIST; do
commands
done
這里的 LIST
可能是一個數(shù)組或者一個項(xiàng)目列表。括號擴(kuò)展 也是進(jìn)行循環(huán)的常用手段。
考慮一下我在開始提到的最簡單的場景。讓我們使用 for
循環(huán)打印從 1 到 10 的數(shù)字:
#!/bin/bash
for num in {1..10}; do
echo $num
done
如果你運(yùn)行它,你應(yīng)該會看到像這樣的輸出:
$ ./for-loop.sh
1
2
3
4
5
6
7
8
9
10
你也可以使用 for num in 1 2 3 4 5 6 7 8 9 10; do
,但是使用括號擴(kuò)展使得代碼看起來更短且更智能。
{..}
是用于擴(kuò)展模式的。你使用 {d..h}
,它等同于 d e f g h
。關(guān)于括號擴(kuò)展的更多信息,可以在這篇文章中找到。
?? 如果你熟悉 C 語言編程,你可能會喜歡在 bash 中使用 C 風(fēng)格的 for 循環(huán):
for ((i = 0 ; i < 10 ; i++)); do echo $i done
讓我們看另一個例子,顯示 Bash 數(shù)組 的所有內(nèi)容:
#!/bin/bash
distros=(Ubuntu Fedora Debian Alpine)
for i in "${distros[@]}"; do
echo $i
done
如果你運(yùn)行腳本,它將顯示數(shù)組中定義的所有發(fā)行版:
Ubuntu
Fedora
Debian
Alpine
Bash 中的 While 循環(huán)
while
循環(huán)測試一個條件,然后只要條件為真,就繼續(xù)循環(huán)。
while [ condition ]; do
commands
done
如果你考慮前一個例子,它可以使用 while
循環(huán)進(jìn)行重寫:
#!/bin/bash
num=1
while [ $num -le 10 ]; do
echo $num
num=$(($num+1))
done
如你所見,你首先需要將變量 num
定義為 1,然后在循環(huán)體內(nèi),你增加 num
的值。只要 num
小于或等于 10,while 循環(huán)就會檢查條件并運(yùn)行腳本。
因此,現(xiàn)在運(yùn)行腳本將會顯示出和之前 for
循環(huán)中看到的完全相同的結(jié)果。
1
2
3
4
5
6
7
8
9
10
讓我們看另一個例子。這是一個 Bash 腳本,它接受一個數(shù)字作為參數(shù) 并顯示該表。
#!/bin/bash
echo "Table for $1 is:"
index=1
while [ $index -le 10 ]; do
echo $(($1*$index))
index=$(($index+1))
done
如果你對 $1
的使用感到困惑,它代表傳遞給腳本的第一個參數(shù)。更多的細(xì)節(jié)可以參考這個系列的 第三章。
如果你運(yùn)行這個腳本,它應(yīng)該會顯示以下的輸出:
$ ./table.sh 2
Table for 2 is:
2
4
6
8
10
12
14
16
18
20
Bash 中的 Until 循環(huán)
這是一個使用較少的循環(huán)格式。它的行為和 while
循環(huán)類似。這里的區(qū)別是,循環(huán)運(yùn)行直到它檢查的條件為真為止。意味著為了在循環(huán)中執(zhí)行代碼,[ ]
中的條件必須為假。
我馬上會解釋一下。讓我們先看一下它的語法。
until [ condition ]; do
commands
done
現(xiàn)在,如果我要使用相同的示例,即使用 until
循環(huán)打印從 1 到 10 的數(shù)字,它看起來會是這樣:
#!/bin/bash
num=1
until [ $num -gt 10 ]; do
echo $num
num=$(($num+1))
done
區(qū)別在于條件;其余部分保持不變。
- 當(dāng)變量
num
小于或等于 10 時,while 循環(huán)就會運(yùn)行。[ ]
中的條件必須為真,循環(huán)才會執(zhí)行。 - 知道變量
num
變得大于 10 時,until 循環(huán)才會運(yùn)行。[ ]
中的條件必須為假,循環(huán)才會執(zhí)行。
這都是做同樣事情的兩種不同方式。while
更受歡迎,因?yàn)槟銜诖蠖鄶?shù)編程語言中找到類似 while
的循環(huán)語法。
??? 練習(xí)時間
那是有趣的。現(xiàn)在是做一些練習(xí)的時候了。
練習(xí) 1:編寫一個腳本,該腳本接受一個數(shù)字作為參數(shù)并打印其表格。如果腳本在沒有參數(shù)的情況下運(yùn)行,你的腳本還應(yīng)顯示一個消息。
預(yù)期輸出:
$: ./table.sh
You forgot to enter a number
$: ./table.sh 3
3
6
9
12
15
18
21
24
27
30
練習(xí) 2 : 編寫一個腳本,列出目錄 /var
中的所有文件。
提示 : 對于循環(huán),使用 /var/*
作為 “列表”。
Bash 基礎(chǔ)知識系列即將結(jié)束。作為該系列的最后一章,你將在下周學(xué)習(xí)在 Bash 腳本中使用函數(shù)。敬請期待。