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

你們好,我是良許。linux

在咱們的平常工做中,須要咱們重複作的工做簡直不能太多。好比,咱們想要確認網絡是不是連通的,傳統的作法就是使用 ping 命令不停去測試某個地址(好比百度)。網絡比較好還好說,但若是網絡不好,那麼就須要一直去運行 ping 命令。程序員

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

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

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

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

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

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

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

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

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
相關文章
相關標籤/搜索