Bash Shell 指令碼/迴圈
外觀
通常我們希望反覆執行相同的命令序列,但略有不同。例如,假設我們要將所有名為 *.txt 的檔案重新命名為 *.txt.bak(“備份”)。我們可以使用檔案擴充套件獲取名為 *.txt 的檔案列表,但如何使用該列表?沒有明顯的命令包含,例如 'foo.txt' 'bar.txt' 'baz.txt',可以執行我們需要的三個移動操作。我們需要的是一個 for 迴圈
for file in *.txt ; do
mv "$file" "$file.bak"
done
上面的程式碼將變數 file 分配給 *.txt 展開後的每個單詞。每次執行迴圈體。換句話說,它等效於以下程式碼
file='foo.txt'
mv "$file" "$file.bak"
file='bar.txt'
mv "$file" "$file.bak"
file='baz.txt'
mv "$file" "$file.bak"
這裡沒有關於檔名擴充套件的特殊之處;我們可以使用相同的方法迭代任何其他引數列表,例如 1 到 20 的整數(使用花括號擴充套件)
for i in {1..20} ; do
echo "$i"
done
或者位置引數 "$@"
for arg in "$@" ; do
echo "$arg"
done
事實上,這個特定的用例非常常見,因此 Bash 提供了等效的簡寫 for arg ; do,其中 in "$@" 是隱含的。(但最好還是使用顯式形式。)
另一種迴圈是 while 迴圈。它類似於 if 語句,不同之處在於只要其測試命令繼續成功,它就會反覆迴圈。例如,假設我們需要等到 wait.txt 檔案被刪除。一種方法是“休眠”幾秒鐘,然後“喚醒”並檢視它是否仍然存在。我們可以以這種方式反覆迴圈
while [[ -e wait.txt ]] ; do
sleep 3 # "sleep" for three seconds
done
相反,我們可以使用 until 迴圈,直到給定的命令成功為止;例如,上面的程式碼的相反操作可能是
until [[ -e proceed.txt ]] ; do
sleep 3 # "sleep" for three seconds
done
當然,這與將 while 與 ! 組合相同,但在某些情況下,它可能更易讀。
- 與
if一樣,while以相同的方式判斷true或false。自己試一試。