Linux 探索之旅 | 第五部分第五课:循环往复,Shell 开路
-- 作者 謝恩銘 轉載請注明出處
內容簡介
1. 前言
上一課 Linux探索之旅 | 第五部分第四課:條件一出,Shell不服 中我們學習了 Shell 中的條件語句。
好吧,我承認,最近幾課的標題有點「雷人」...
有了上一課的基礎,這一課將是很輕松的。
我們來學習一個所有編程語言都有的要素:循環語句。
循環語句使我們得夠重復一個代碼塊任意多次。這么有用的機制,Shell 語言當然支持。
Shell 中,主要的循環語句有三種:while 循環,until 循環 和 for 循環。我們一一來學習。
2. while 循環
在 Shell 中,我們最常用的循環是 while 循環。
while 是英語「當... 的時候;在… 期間」的意思。
while 循環的邏輯是這樣的:
while [ 條件測試 ] do做某些事 done復制代碼do 是英語「做」的意思。
done 是英語「完成」的意思。
當然了,我們也可以像在 if 語句中那樣,把 關鍵字 do 放到與條件測試同一行上,但是之間要加分號,如下:
while [ 條件測試 ]; do做某些事 done復制代碼while 循環流程圖:
while 循環流程圖我們來寫一個程序,它會請求用戶輸入「 yes 」(英語「是」的意思),如果用戶沒有輸入任何字符或者輸入的字符串不是 「yes」,那么程序就一直請求。
首先,我們創建一個名叫 「 loop.sh 」的文件( loop 是英語「循環」的意思)。
vim loop.sh復制代碼在這個文件中輸入以下內容:
while [ -z $response ] || [ $response != 'yes' ] doread -p 'Say yes : ' response done復制代碼response 是英語「回答」的意思。
say 是英語「說」的意思。
運行:
我們做了兩個條件測試:
- response是否是空 :-z $response
- response 是否不等于「yes」:$response != 'yes'
因為這兩個條件測試之間是用 || (邏輯或)連接的,因此只要兩個條件有一個成立,整個條件測試即成立,就會執行 do 和 done 之間的語句。
可以看到,這個程序非常「任性」,只要我們輸入的不是「 yes 」,它就不停止輸出「 Say yes : 」。真是「咄咄逼人」...
3. until 循環
與 while 這個關鍵字相反的有一個 until 關鍵字,until 在英語中是 「直到」的意思。
它也可以實現循環,只不過邏輯和 while 循環正好相反。
until 循環流程圖:
until 循環流程圖我們可以用 until 來改寫一下上面的程序:
until [ "$response" = 'yes' ] doread -p 'Say yes : ' response done復制代碼運行結果和 while 循環那個是一樣的。
4. for 循環
for 是英語「對于」的意思。
首先,我們要提醒已經學過主流編程語言(如 C語言,Java,等等)的讀者,Shell 中的 for 循環和你已經習慣的 for 循環方式略有不同。
我們一起來學習吧。
遍歷列表
for 循環可以遍歷一個「取值列表」,基本的邏輯如下:
for 變量 in '值1' '值2' '值3' ... '值n' do做某些事 done復制代碼in 是英語「在... 之中」的意思。
for 循環流程圖:
for 循環流程圖我們來寫一個例子:
for animal in 'dog' 'cat' 'pig' doecho "Animal being analyzed : $animal" done復制代碼「 Animal being analyzed 」是英語「正在被分析的動物」的意思。
運行:
可以看到,animal 這個變量依次取了 'dog'(狗), 'cat'(貓), 'pig'(豬) 這三個值。
for 循環的取值列表不一定要在代碼中定義好,我們也可以用一個變量,如下例:
listfile=`ls`for file in $listfile doecho "File found : $file" done復制代碼「 File found 」是英語「找到的文件」的意思。
運行:
如你所見,上面的程序列出了當前目錄下所有的文件。
我們還可以簡化上面的程序,不需要用到 listfile 這個變量:
for file in `ls` doecho "File found : $file" done復制代碼我們可以再改進這個程序,讓它復制當前目錄下的文件,并且把每個副本的名字修改為「現有名字 + -copy」 (copy 是英語「拷貝」的意思):
for file in `ls` docp $file $file-copy done復制代碼運行:
可見,Shell 非常強大。
更常規的 for 循環
剛才我們看到的 for 循環,和主流編程語言中的語法略有不同,不過我們可以借助 seq 命令,來實現類似主流編程語言中的 for 循環的語法。
seq 是 sequence 的縮寫,是英語「序列」的意思。
來寫一個例子:
for i in `seq 1 10` doecho $i done復制代碼運行:
以上程序中,「 seq 1 10 」會返回一個取值列表,是從 1 到 10 的整數值。因此,echo 就會遍歷輸出 1 到 10 這 10 個整數。
我們也可以修改默認的取值間隔 ( 1 ),改成我們需要的數值,如下:
for i in `seq 1 2 10` doecho $i done復制代碼運行:
以上程序中,「 seq 1 2 10 」會返回一個取值列表,是從 1 到 10 的整數值,但是取值間隔是 2,echo 就會遍歷輸出 1 到 10 這 10 個整數中的 1,3,5,7,9 這5個整數。
5. 總結
我們使用循環語句來重復執行一系列指令。
while 循環在條件滿足的情況下可以一直重復執行。其中的條件測試語句的機制和上一課的條件語句中的一樣。
until 循環和 while 循環的邏輯正好相反。
for 循環可以遍歷一個「取值列表」,來依次執行相應的指令。在 for 循環內部,變量的取值會逐步變化。
6. 第五部分第六課預告
今天的課就到這里,一起加油吧!
下一課我們學習:一朝Shell函數傾,斗轉星移任我行
微信公眾號「程序員聯盟」ProgrammerLeague
我是謝恩銘,在巴黎奮斗的軟件工程師。
我的簡介
我的經歷
熱愛生活,喜歡游泳,略懂烹飪。
人生格言:“向著標桿直跑”
總結
以上是生活随笔為你收集整理的Linux 探索之旅 | 第五部分第五课:循环往复,Shell 开路的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Windows下挂载iscsi存储及多路
- 下一篇: Nexys3学习手记1:写在前面的话