2011-12-06 161 views
5

在bash,我知道我應該使用&&如果我想要一個命令B要運行命令A成功後:如何在一些其他命令成功運行後才能運行命令?

A && B 

但是,如果我想D被運行後,才ABC所有什麼成功? 是

'A&B&C' && D 

好嗎?

此外,我應該怎麼做,如果我想確切地知道哪些命令失敗,其中ABC(因爲他們會跑很多次,這將需要一段時間,如果我逐一檢查)。

只要任何命令失敗,錯誤信息是否可能會自動輸出到文本文件?

在我的情況下,ABCcurlBrm,我的劇本是這樣的:

for f in * 
do 
    curl -T server1.com 
    curl -T server2.com 
    ... 
    rm $f 
done 
+0

如果'A'失敗,你想運行'B'和'C'嗎?任何命令失敗後,A && B && C && D'將立即退出。但是,如果您想無條件地運行'A','B'和'C',並且只有在它們全部成功時才運行'D',那麼請參閱@ Adam的回答。 (不,'A&B&C && D'不會做你想做的事;單個'&'會導致命令在後臺運行。) –

+0

感謝您的編輯:) – erical

+0

可以使用括號嗎? – Gabriel

回答

0

您可以通過執行即

擺脫先前的命令返回命令; echo $?

1 =失敗 0 =成功

在一個更加結構化的格式,例如:

cat /var/log/secure 
    if [ $? -ne "1" ] ; then 
    echo "Error" ; exit 1 
    fi 
+0

謝謝你的幫助:) – erical

5

試試這個:

A; A_EXIT=$? 
B; B_EXIT=$? 
C; C_EXIT=$? 
if [ $A_EXIT -eq 0 -a $B_EXIT -eq 0 -a $C_EXIT ] 
then 
    D 
fi 

變量A_EXITB_EXITC_EXIT告訴你哪些,如果有的話,AB,C命令s失敗了。您可以在每條命令(如命令)之後使用額外的if語句輸出到文件中。

A; A_EXIT=$? 
if [ $A_EXIT -ne 0 ] 
then 
    echo "A failed" > text_file 
fi 
+0

謝謝你的幫助,你能告訴什麼是「$?」嗎?是什麼意思?我似乎經常在bash腳本中遇見它,但它在google – erical

+0

$中搜索不到?是shell的特殊變量,它保存最後的前臺命令的狀態。搜索這些東西的好地方是bash manpage:http://linux.die.net/man/1/bash –

+0

哦,謝謝!這真的是一個幫助網站 – erical

1

爲什麼不把你的命令存儲在一個數組中,然後迭代它,當一個失敗時退出?

#!/bin/bash 

commands=(
    [0]="ls" 
    [1]="ls .." 
    [2]="ls foo" 
    [3]="ls /" 
) 

for ((i = 0; i < 4; i++)); do 
    ${commands[i]} 
    if [ $? -ne 0 ]; then 
     echo "${commands[i]} failed with $?" 
     exit 
    fi 
done 
+0

謝謝你的幫助:) – erical