如何重複執行一條命令直至運行成功?

大家好,我是良許。

在我們的日常工作中,需要我們重複做的工作簡直不能太多。比如,我們想要確認網絡是否是連通的,傳統的做法就是使用 ping 命令不停去測試某個地址(比如百度)。網絡比較好還好說,但如果網絡很差,那麼就需要一直去運行 ping 命令。

作爲程序員,重複性的工作怎麼能忍呢?只要是重複性的工作,就有可能使用編程的方式來解決!

下面良許就介紹兩種方法重複執行一條命令直至運行成功。

(PS:本文適合初學者,高手可繞道)

解決重複性的工作,自然而然會想到循環 。在 Shell 裏,循環無非 3 種:forwhileuntil 。在本文裏,我們使用後兩種循環:whileuntil

關於這兩種循環,有編程基礎的小夥伴應該是比較熟悉的了,這裏再複習一下。

對於 while 循環,在循環條件是 true 的情況下,它會重複執行循環體(包含在 do ... done 結構體裏),直到循環條件變成 false 。

而對於 untile 循環,剛好與 while 循環相反,在循環條件是 false 的情況下,它會重複執行循環體(包含在 do ... done 結構體裏),直到循環條件變成 true 。

好了,複習完基礎知識,我們再來看看如何用這兩個循環實現我們的目的。

1. 使用 while 循環

還是以重複測試網絡連通性爲例。我們可以使用以下命令來解放我們的雙手:

$ while ! ping -c 3 baidu.com ; do sleep 2 ; done ; echo succeed

對於這條命令,它將重複執行 ping 命令,如果不成功,則 sleep 2 秒之後繼續嘗試,直到成功。成功之後,將在終端打印 succeed 字樣。

簡單介紹:

我們將這個命令分解開,然後簡要介紹各個模塊的作用。

$ while ! ping -c 3 baidu.com ;

這是循環條件,我們的要求是「當 ping 命令執行失敗時,執行循環體」,所以我們要在 ping 之前加一個 !

$ do sleep 2 ; done ;

這部分就是循環體。當循環條件成立時,就進入到循環體。爲了不讓這個程序搶佔太多資源,我們在循環體裏睡眠 2 秒。一旦循環條件不成立時,就跳出循環體。

$ echo succeed ;

這部分是跳出循環體之後執行的語句,僅僅是打印一個 succeed 字樣,當然你要做其它事也可以。

2. 使用 until 循環

我們使用 until 循環來完成同樣的事情,它的寫法如下:

$ until ping -c 3 baidu.com ; do sleep 2 ; done ; echo succeed

實現的效果與上面無異,所不同的是,當循環條件爲真時,退出循環。

我們也來簡單拆解一下。

$ until ping -c 3 baidu.com ;

這部分是循環條件,它將執行 ping 命令,執行結果作爲判斷依據。直到 ping 命令執行成功時,才退出循環。

$ do sleep 2 ;

循環體,睡眠 2 秒。

$ echo succeed

成功後做的事情。

3. 重複執行上個命令直到成功

這裏再額外拓展一下,如何重複執行上個命令直到成功?

我們知道,想要重複運行上次的命令,可以使用這個命令:

$ !!

那如何判斷上個命令執行是否成功呢?我們可以通過判斷 $? 的值是否爲 0 來確定。

# while 循環寫法
$ !!; while [ $? -ne 0 ]; do !!; done

# until 循環寫法
$ until !!; do :; done

看完的都是真愛,點個贊再走唄?您的「三連」就是良許持續創作的最大動力!

  1. 關注原創公衆號「良許Linux」,第一時間獲取最新Linux乾貨!
  2. 公衆號後臺回覆【資料】【面試】【簡歷】獲取精選一線大廠面試、自我提升、簡歷等資料。
  3. 關注我的博客:lxlinux.net
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章