2013-12-17 33 views
3

下面是我的shell腳本的片段,其中我正在執行scp命令將文件從machineB複製到machineA檢查scp命令的狀態代碼,如果它失敗,然後在另一臺機器上調用scp

for element in ${x[$key]}; do # no quotes here 
    printf "%s\t%s\n" "$key" "$element" 
    if [ $key -eq 0 ] 
    then 
     scp [email protected]:/data/be_t1_snapshot/20131215/t1_$element_5.data /data01/primary/. 
    fi  
done 

我將在下文提到一個很簡單的問題 -

如果我的shell腳本以上scp命令給了我這個錯誤不管是什麼原因 - No such file or directory 然後我需要從machineC嘗試做scp併爲scp命令將是這樣的,只有機器將會有所不同,其他的一切都會一樣的 -

scp [email protected]:/data/be_t1_snapshot/20131215/t1_$element_5.data /data01/primary/. 

所以我的問題是如何檢查T的輸出他上面的scp命令在我的shell腳本中,然後決定是否需要從machineC調用scp命令?有什麼地位的東西,我可以用來檢查,如果它因任何原因失敗,然後我可以在machineC上調用scp命令?

這是可能的shell腳本來完成?

+0

也許Rsync是您正在尋找的解決方案。它可以幫助您同時在網絡上同步兩個目錄。 –

+0

或Unison - 我在博客上發帖:http://www.linuxintro.org/wiki/Unison。它也可以通過網絡以非圖形方式工作(因爲您需要一個shell腳本)。 –

回答

2

在這裏你去:

for element in ${x[$key]}; do # no quotes here 
    printf "%s\t%s\n" "$key" "$element" 
    if [ $key -eq 0 ] 
    then 
     scp [email protected]:/data/be_t1_snapshot/20131215/t1_$element_5.data /data01/primary/. || scp [email protected]:/data/be_t1_snapshot/20131215/t1_$element_5.data /data01/primary/ 
    fi  
done 

良好運行得命令退出與「成功」(退出代碼= 0),如果操作成功,或以其他方式退出代碼= 0您可以鏈的命令!一起是這樣的:

cmd && echo successful || echo failed 
cmd && keep going || do something else 

退出代碼也被存儲在$?變量,所以這是等價的:

cmd; if $? = 0; then echo successful; else echo failed; fi 

這不僅是可能的,命令的狀態代碼是shell腳本非常重要。考慮以下兩個例子:

./configure && make && make install 
./configure; make; make install 

第一個將執行命令的鏈條,如果全部成功。第二個將執行所有這些總是,即使較早的命令失敗。

+0

感謝您的建議。所以你說的是,如果第一個scp命令因爲什麼原因失敗了,那麼第二個scp命令會被正確執行?如果第一個scp命令成功執行,那麼它將不會執行第二個scp命令? – AKIWEB

1

SCP返回0只聞其成功。 所以你可以這樣寫:

scp machineB:/path/toyourfile . 
if [ $? -ne 0 ] 
then 
    scp machineC:/path/to/your/file . 
fi 

較短的方法是:

scp machineB:/path/toyourfile . 
[ $? -eq 0 ] || scp machineC:/path/to/your/file . 

scp machineB:/path/toyourfile . 
[ $? -ne 0 ] && scp machineC:/path/to/your/file . 

我個人更喜歡在更短的方式,和SCP輸出的無在腳本中使用:

scp -q machineB:/path/to/your/file . || scp -q machineC:/path/to/your/file . 

,記得使用${element}代替$element