1. 程式人生 > >Shell指令碼命令的執行順序

Shell指令碼命令的執行順序

如果希望在成功地執行一個命令之後再執行另一個命令,或者在一個命令失敗後再執行另一個命令,&&和||可以完成這樣的功能。相應的命令可以是系統命令或shell指令碼。Shell還提供了在當前shell或子shell中執行一組命令的方法,即使用()和{}。


1.使用&&:
形式:命令1 && 命令2
&&左邊的命令(命令1)返回真(即返回0,成功被執行)後,右邊的命令(命令2)才能夠被執行;
eg1:
$ cp test.sh test.bak && echo "if you are seeing this then cp was OK"
將/apps/bin目錄將會被移到/apps/dev/bin目錄下,如果它沒有被成功執行就不會刪除/apps/bin目錄;
$ mv /apps/bin /apps/dev/bin && rm -r /apps/bin
檔案quarter_end.txt首先將被排序並輸出到檔案quarter.sorted中,只有這一命令執行成功,檔案quarter.sorted才會被列印;
$ sort quarter_end.txt > quarter.sorted && lp quarter.sorted


2.使用||:
形式:命令1 || 命令2
如果左邊的命令(命令1)執行失敗了,那麼就執行右邊的命令(命令2);
$ cp wopper.txt oops.txt || echo "if you are seeing this cp failed"
從一個檔案中抽取第1個和第5個域,並將其輸出到一個臨時檔案中,如果沒有成功,收取一個郵件;
$ awk '{print$1,$5}' acc.qtr >qtr.tmp || echo "Sorry the payroo extraction didn't work" | mail dave
對month_end.txt檔案執行了一個名為comet的shell指令碼,如果該指令碼未執行成功,該shell將結束;
$ comet month_end.txt || exit


3.使()和{}將命令結合在一起:
在當前shell中執行一組命令,可以用命令分隔符隔開每一個合令,並把所有的命令用圓括號()括起來;
形式:
(命令1;命令2;...)
如果使用{}代替(),那麼相應的命令將在子shell而不是當前shell中作為一個整體被執行,只有有在{}中所有命令的輸出作為一個整體被重定向時,其中的命令才被放到子shell中執行,否則在當前shell執行。
形式:
{命令1;命令2;...}
如果comet執行不成功,在退出之前給自已發一個郵件;
$ comet month_end.txt || (echo "Hello, guess what! Comet did not work" | mail sun; exit)
對檔案排序成功後,列印之前,先拷貝進日誌區;
$ sort quarter_end.txt > quarter.sorted && (cp quarter.sorted /logs/quarter.sorted; lp quarter.sorted)