如何重復(fù)執(zhí)行一條命令直至運行成功?
在我們的日常工作中,需要我們重復(fù)做的工作簡直不能太多。比如,我們想要確認(rèn)網(wǎng)絡(luò)是否是連通的,傳統(tǒng)的做法就是使用 ping 命令不停去測試某個地址(比如百度)。網(wǎng)絡(luò)比較好還好說,但如果網(wǎng)絡(luò)很差,那么就需要一直去運行 ping 命令。
作為程序員,重復(fù)性的工作怎么能忍呢?只要是重復(fù)性的工作,就有可能使用編程的方式來解決!
下面良許就介紹兩種方法重復(fù)執(zhí)行一條命令直至運行成功。
(PS:本文適合初學(xué)者,高手可繞道)
解決重復(fù)性的工作,自然而然會想到循環(huán) 。在 Shell 里,循環(huán)無非 3 種:for、while、until 。在本文里,我們使用后兩種循環(huán):while 、until 。
關(guān)于這兩種循環(huán),有編程基礎(chǔ)的小伙伴應(yīng)該是比較熟悉的了,這里再復(fù)習(xí)一下。
對于 while 循環(huán),在循環(huán)條件是 true 的情況下,它會重復(fù)執(zhí)行循環(huán)體(包含在 do ... done結(jié)構(gòu)體里),直到循環(huán)條件變成 false 。
而對于 untile 循環(huán),剛好與 while 循環(huán)相反,在循環(huán)條件是 false 的情況下,它會重復(fù)執(zhí)行循環(huán)體(包含在 do ... done 結(jié)構(gòu)體里),直到循環(huán)條件變成 true 。
好了,復(fù)習(xí)完基礎(chǔ)知識,我們再來看看如何用這兩個循環(huán)實現(xiàn)我們的目的。
1. 使用 while 循環(huán)
還是以重復(fù)測試網(wǎng)絡(luò)連通性為例。我們可以使用以下命令來解放我們的雙手:
- $ while ! ping -c 3 baidu.com ; do sleep 2 ; done ; echo succeed
 
對于這條命令,它將重復(fù)執(zhí)行 ping 命令,如果不成功,則 sleep 2 秒之后繼續(xù)嘗試,直到成功。成功之后,將在終端打印 succeed 字樣。
簡單介紹:
我們將這個命令分解開,然后簡要介紹各個模塊的作用。
- $ while ! ping -c 3 baidu.com ;
 
這是循環(huán)條件,我們的要求是「當(dāng) ping 命令執(zhí)行失敗時,執(zhí)行循環(huán)體」,所以我們要在 ping 之前加一個 ! 。
- $ do sleep 2 ; done ;
 
這部分就是循環(huán)體。當(dāng)循環(huán)條件成立時,就進(jìn)入到循環(huán)體。為了不讓這個程序搶占太多資源,我們在循環(huán)體里睡眠 2 秒。一旦循環(huán)條件不成立時,就跳出循環(huán)體。
- $ echo succeed ;
 
這部分是跳出循環(huán)體之后執(zhí)行的語句,僅僅是打印一個 succeed 字樣,當(dāng)然你要做其它事也可以。

2. 使用 until 循環(huán)
我們使用 until 循環(huán)來完成同樣的事情,它的寫法如下:
- $ until ping -c 3 baidu.com ; do sleep 2 ; done ; echo succeed
 
實現(xiàn)的效果與上面無異,所不同的是,當(dāng)循環(huán)條件為真時,退出循環(huán)。
我們也來簡單拆解一下。
- $ until ping -c 3 baidu.com ;
 
這部分是循環(huán)條件,它將執(zhí)行 ping 命令,執(zhí)行結(jié)果作為判斷依據(jù)。直到 ping 命令執(zhí)行成功時,才退出循環(huán)。
- $ do sleep 2 ;
 
循環(huán)體,睡眠 2 秒。
- $ echo succeed
 
成功后做的事情。

3. 重復(fù)執(zhí)行上個命令直到成功
這里再額外拓展一下,如何重復(fù)執(zhí)行上個命令直到成功?
我們知道,想要重復(fù)運行上次的命令,可以使用這個命令:
- $ !!
 
那如何判斷上個命令執(zhí)行是否成功呢?我們可以通過判斷 $? 的值是否為 0 來確定。
- # while 循環(huán)寫法
 - $ !!; while [ $? -ne 0 ]; do !!; done
 - # until 循環(huán)寫法
 - $ until !!; do :; done
 
本文授權(quán)轉(zhuǎn)載自公眾號「良許Linux」。良許,世界500強外企Linux開發(fā)工程師,公眾號里分享大量Linux干貨,歡迎關(guān)注!
















 
 
 











 
 
 
 