大家好,我是良許。 在我們的日常工作中,需要我們重覆做的工作簡直不能太多。比如,我們想要確認網路是否是連通的,傳統的做法就是使用 ping 命令不停去測試某個地址(比如百度)。網路比較好還好說,但如果網路很差,那麼就需要一直去運行 ping 命令。 作為程式員,重覆性的工作怎麼能忍呢?只要是重覆性的 ...
大家好,我是良許。
在我們的日常工作中,需要我們重覆做的工作簡直不能太多。比如,我們想要確認網路是否是連通的,傳統的做法就是使用 ping
命令不停去測試某個地址(比如百度)。網路比較好還好說,但如果網路很差,那麼就需要一直去運行 ping
命令。
作為程式員,重覆性的工作怎麼能忍呢?只要是重覆性的工作,就有可能使用編程的方式來解決!
下麵良許就介紹兩種方法重覆執行一條命令直至運行成功。
(PS:本文適合初學者,高手可繞道)
解決重覆性的工作,自然而然會想到迴圈
。在 Shell 里,迴圈無非 3 種:for
、while
、until
。在本文里,我們使用後兩種迴圈:while
、until
。
關於這兩種迴圈,有編程基礎的小伙伴應該是比較熟悉的了,這裡再複習一下。
對於 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
看完的都是真愛,點個贊再走唄?您的「三連」就是良許持續創作的最大動力!
- 關註原創公眾號「良許Linux」,第一時間獲取最新Linux乾貨!
- 公眾號後臺回覆【資料】【面試】【簡歷】獲取精選一線大廠面試、自我提升、簡歷等資料。
- 關註我的博客:lxlinux.net