在執行某個命令的時候,有時須要依賴於前一個命令是否執行成功。例如,假設你但願將一個目錄中的文件所有拷貝到另一個目錄中後,而後刪除源目錄中的所有文件。在刪除以前,你但願可以確信拷貝成功,不然就有可能丟失全部的文件。
在本章中,咱們將討論:
命令執行控制。
命令組合。
若是但願在成功地執行一個命令以後再執行另外一個命令,或者在一個命令失敗後再執行另外一個命令,&&和||能夠完成這樣的功能。相應的命令能夠是系統命令或shell腳本。
Shell還提供了在當前shell或子shell中執行一組命令的方法,即便用()和{}。
6.1 使用&&
使用&&的通常形式爲:
命令1 && 命令2
這種命令執行方式至關地直接。&&左邊的命令(命令1)返回真(即返回0,成功被執行)後,&&右邊的命令(命令2)纔可以被執行;換句話說,「若是這個命令執行成功&&那麼執行這個命令」。
這裏有一個使用&&的簡單例子:
$ cp justing.doc justing.bak && echo 「if you are seeing this then cp was OK」
if you are seeing this then cp was OK
在上面的例子中,&&前面的拷貝命令執行成功,因此&&後面的命令(echo命令)被執行。
再看一個更爲實用的例子:
$ mv /apps/bin /apps/dev/bin && rm -r /apps/bin
在上面的例子中,/apps/bin目錄將會被移到/apps/dev/bin目錄下,若是它沒有被成功執行,就不會刪除/apps/bin目錄。
在下面的例子中,文件quarter_end.txt首先將被排序並輸出到文件quarter.sorted中,只有這一命令執行成功以後,文件quarter.sorted纔會被打印出來:
$ sort quarter_end.txt > quarter.sorted && lp quarter.sorted
6.2 使用||
使用||的通常形式爲:
命令1 || 命令2
||的做用有一些不一樣。若是||左邊的命令(命令1)未執行成功,那麼就執行||右邊的命令(命令2);或者換句話說,「若是這個命令執行失敗了|| 那麼就執行這個命令」。
這裏有一個使用||的簡單例子:
$ cp wopper.txt wopper.bak || echo 「if you are seeing this cp failed」
cp: wopper.txt: No such file or directory
if you are seeing this cp failed
在上面的例子中,拷貝命令沒有可以被成功執行,所以||後面的命令被執行。
這裏有一個更爲實用的例子。我但願從一個審計文件中抽取第1個和第5個域,並將其輸出到一個臨時文件中,若是這一操做未成功,我但願可以收到一個相應郵件:
$ awk ‘{print $5}’ acc.qtr > qtr.tmp || echo 「Sorry the payroll extraction didn’t work」 | mail dave
在這裏不僅可使用系統命令;這裏咱們首先對month_end.txt文件執行了一個名爲comet的shell腳本,若是該腳本未執行成功,該shell將結束。
$ comet month_end.txt || exit
6.3 用()和{}將命令結合在一塊兒
若是但願把幾個命令合在一塊兒執行, shell提供了兩種方法。既能夠在當前shell也能夠在子shell中執行一組命令。
爲了在當前shell中執行一組命令,能夠用命令分隔符隔開每個命令,並把全部的命令用圓括號()括起來。
它的通常形式爲:
(命令1;命令2;. . .)
若是使用{ }來代替(),那麼相應的命令將在子shell而不是當前shell中做爲一個總體被執行,只有在{ }中全部命令的輸出做爲一個總體被重定向時,其中的命令才被放到子shell中執行,不然在當前shell執行。它的通常形式爲:
{命令1;命令2;. . . }
我不多單獨使用這兩種方法。我通常只和&&或||一塊兒使用這兩種方法。
再回到前面那個comet腳本的例子,若是這個腳本執行失敗了,我極可能會但願執行兩個以上的命令,而不僅是一個命令。我可使用這兩種方法。這是原先那個例子:
$ comet month_end.txt || exit
如今若是該腳本執行失敗了,我但願先給本身發個郵件,而後再退出,能夠用下面的方法來實現:
$ comet month_end.txt || (echo 「Hello, guess what! Comet did not work」|mail dave;exit)
在上面的例子中,若是隻使用了命令分隔符而沒有把它們組合在一塊兒,shell將直接執行最後一個命令(exit)。
咱們再回頭來看看前面那個使用&&排序的例子,下面是原來的那個例子:
$ sort quarter_end.txt > quarter.sorted && lp quarter.sorted
使用命令組合的方法,若是sort命令執行成功了,能夠先將輸出文件拷貝到一個日誌區,而後再打印。
6.4 小結
在編寫shell腳本時,使用&&和||對構造判斷語句很是有用。若是但願在前一個命令執行失敗的狀況不執行後面的命令,那麼本章所講述的方法很是簡單有效。使用這樣的方法,能夠根據&&或||前面命令的返回值來控制其後面命令的執行。shell