2011-03-11 31 views
9

我有一個shell腳本,我正在處理這一行代碼,它通過本地文件(.gz)執行循環並執行scp。如果可能,我想測試失敗的scp。我正在做一個循環,所以我可以將每個文件名回顯到日誌,以便我可以跟蹤它。以編程方式檢查shell腳本中失敗的scp的最佳方式

有人可以告訴我如何檢查失敗的scp嗎?或更好的,一個很好的代碼示例來做到這一點?謝謝你的幫助。

for gzfile in $LOCALDMPDIR/*.gz 
do 
    /usr/bin/scp -P 2222 -i $KEYFILE $gzfile [email protected]$1:$TGTDIR 
    echo "$gzfile is done. " 2>&1 
done 
+1

我也建議使用'-q'選項SCP的防止它提示輸入密碼如果密鑰被遠程服務器 – Petesh 2013-06-21 21:36:27

回答

15

使用$?訪問最後一個命令的返回值。檢查scp的手冊頁來驗證,但我認爲返回值爲零意味着成功。非零值意味着某種失敗。

+0

拒絕,就像'$? > 1然後回顯「scp failed」? – jdamae 2011-03-11 00:33:19

+0

@jdamae:'if(($?> 0));然後回顯「scp失敗」; fi'(或'!=')或'if [$? -ne 0]' – 2011-03-11 03:08:52

+0

@丹尼斯 - 感謝這個例子。 – jdamae 2011-03-11 03:14:52

4

您可以查看變量$?以查看scp的返回碼。如果它返回非零,則發生錯誤。

0

對於愚像我在那裏誰比正常搞亂格式錯誤不再花費:

scp "fromHere" hostname:"toThere" 
if [ "$?" -eq "0" ]; 
then 
    echo "SUCCESS" 
else 
    echo "FAIL" 
fi 
+2

[和下一個字符之間需要有空格。 (單個「[」是調用測試的捷徑)。上面的例子給我錯誤,所以我不得不插入一個空格。 – Daps0l 2013-11-30 17:34:25

5

使用:

if [ $? -eq 0 ]; 
then 
    echo "OK"</br> 
else 
    echo "NOK"</br> 
fi 

那裏是後「[」空白和之前「 ]」。 不包圍$?和0引號

+0

如果你只是想知道它是否失敗,(你不需要「OK」部分),那麼你可以使用'ne'作爲你的操作符(不等於),例如, '如果[$? -ne 0];' – 2016-03-01 13:27:52

1

您也可以嘗試捕捉錯誤日誌:

for gzfile in $LOCALDMPDIR/*.gz 
do 
    /usr/bin/scp -P 2222 -i $KEYFILE $gzfile [email protected]$1:$TGTDIR 2>>/var/log/scperror.log \ 
    && echo "$gzfile is done." \ 
    || echo "scp error: $gzfile" 
done 
相關問題