[unix shell筆記] - 命令執行順序

在執行某個命令的時候,有時須要依賴於前一個命令是否執行成功。例如,假設你但願將一個目錄中的文件所有拷貝到另一個目錄中後,而後刪除源目錄中的所有文件。在刪除以前,你但願可以確信拷貝成功,不然就有可能丟失全部的文件。

  在本章中,咱們將討論:
  命令執行控制。
  命令組合。
  

  若是但願在成功地執行一個命令以後再執行另外一個命令,或者在一個命令失敗後再執行另外一個命令,&&和||能夠完成這樣的功能。相應的命令能夠是系統命令或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

相關文章
相關標籤/搜索