你們好,我是良許。linux
在咱們的平常工做中,須要咱們重複作的工做簡直不能太多。好比,咱們想要確認網絡是不是連通的,傳統的作法就是使用 ping
命令不停去測試某個地址(好比百度)。網絡比較好還好說,但若是網絡不好,那麼就須要一直去運行 ping
命令。程序員
做爲程序員,重複性的工做怎麼能忍呢?只要是重複性的工做,就有可能使用編程的方式來解決!面試
下面良許就介紹兩種方法重複執行一條命令直至運行成功。編程
(PS:本文適合初學者,高手可繞道)網絡
解決重複性的工做,天然而然會想到循環
。在 Shell 裏,循環無非 3 種:for
、while
、until
。在本文裏,咱們使用後兩種循環:while
、until
。測試
關於這兩種循環,有編程基礎的小夥伴應該是比較熟悉的了,這裏再複習一下。spa
對於 while
循環,在循環條件是 true 的狀況下,它會重複執行循環體(包含在 do ... done
結構體裏),直到循環條件變成 false 。.net
而對於 untile
循環,恰好與 while
循環相反,在循環條件是 false 的狀況下,它會重複執行循環體(包含在 do ... done
結構體裏),直到循環條件變成 true 。3d
好了,複習完基礎知識,咱們再來看看如何用這兩個循環實現咱們的目的。code
仍是以重複測試網絡連通性爲例。咱們可使用如下命令來解放咱們的雙手:
$ 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 字樣,固然你要作其它事也能夠。
咱們使用 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複製代碼
成功後作的事情。
這裏再額外拓展一下,如何重複執行上個命令直到成功?
咱們知道,想要重複運行上次的命令,可使用這個命令:
$ !!複製代碼
那如何判斷上個命令執行是否成功呢?咱們能夠經過判斷 $?
的值是否爲 0 來肯定。
# while 循環寫法
$ !!; while [ $? -ne 0 ]; do !!; done
# until 循環寫法
$ until !!; do :; done複製代碼