2017-07-03 219 views
0

我寫了一個不顯示任何錯誤的bash腳本。但是我想添加條件阻止列表,如果成功,然後顯示電子郵件成功,否則在電子郵件中顯示錯誤消息,如下面的代碼所示。如果其他在shell命令的bash腳本中

scp -i id_rsa -r [email protected]:/data1/scp ~/data/scp/files 
success >> ~/data/scp/files/log.txt 2>&1 
if success 
then 
| mail -s "Download 
Successfull" [email protected] <<< "Files Successfully Downloaded" 
else 
| mail -s "Error: Download Failed" [email protected] <<< "Error File download 
Failed!" 
fi 

這裏是沒有的if else塊

#!/module/for/bash 
scp -i id_rsa -r [email protected]:/data1/scp ~/data/scp/files 
echo success! >> ~/data/scp/files/log.txt 2>&1 | mail -s "Download 
Successfull" [email protected] <<< "Files Successfully 
Downloaded" | mail -s "Error: Download Failed" [email protected] <<< 
"Error:file download Failed!" 
+0

我搜索了'if else bash',並且得到了大量相關結果。你的問題到底是什麼? – HFBrowning

+0

@HFBrowning請參閱更新的問題我得到格式錯誤 –

+1

您的'then'和'else'分支從管道開始;你不能這樣做。如果你想要變成一個有條件的管道,那麼管道需要放在'if'之前。我不記得你是否還需要在子外殼中包含整個有條件的'if' ...'else' ...'fi'塊。 –

回答

2

的SCP手冊頁指出:The scp utility exits 0 on success, and >0 if an error occurs.

所以,你可以這樣做:

if scp -i id_rsa -r [email protected]:/data1/scp ~/data/scp/files 
then 
    mail -s "Download Successful" [email protected] <<<"Files Downloaded" 
else 
    mail -s "Download Error" [email protected] <<<"Download error" 
fi 

scp -i id_rsa -r [email protected]:/data1/scp ~/data/scp/files 
if [[ $? -eq 0 ]] 
then 
    mail -s "Download Successful" [email protected] <<<"Files Downloaded" 
else 
    mail -s "Download Error" [email protected] <<<"Download error" 
fi 

最後你可能也想看看像存儲SCP輸出。使用-q有SCP沒有打印出進度條,什麼不可以:

MYOUT=$(scp -q -i id_rsa -r [email protected]:/data1/scp ~/data/scp/files 2>&1) 
if [[ $? -eq 0 ]] 
then 
    mail -s "Download Successful" [email protected] <<<"$MYOUT" 
else 
    mail -s "Download Error" [email protected] <<<"$MYOUT" 
fi 
0

link應該清除空氣中的工作腳本。希望它有幫助!

0

@Korthrun已經發布幾種方式來完成我認爲你正在試圖做的;我會看看當前腳本中出現了什麼問題。您似乎對shell腳本的幾個基本元素感到困惑:管道(|)和測試命令成功/失敗。

管道用於將一個命令的輸出傳遞給另一個命令的輸入(並且可能將第二個命令的輸出鏈接到第三個命令的輸入等中)。但是,當你使用管柱這樣的:

echo success! >> ~/data/scp/files/log.txt 2>&1 | 
mail -s "Download Successfull" [email protected] <<< "Files Successfully Downloaded" | 
mail -s "Error: Download Failed" [email protected] <<< "Error:file download Failed!" 

管道實際上並沒有做任何事情。第一個管道嘗試輸出echo並將其輸入到mail的輸入,但echo命令中的>>將其輸出發送到文件,因此沒有實際數據發送到mail命令。這可能是好的,因爲mail命令中的<<<指示它忽略常規輸入(來自管道),並將字符串作爲輸入提供。同樣,第二個管道嘗試將第一個mail命令(不存在任何)的輸出提供給最後的mail命令,但由於另一個<<<輸入字符串而再次被忽略。要做到這一點,正確的方法是簡單地去除管道,並單獨運行每個命令:

if success 
then 
| mail -s "Download Successfull" [email protected] <<< "Files Successfully Downloaded" 

echo success! >> ~/data/scp/files/log.txt 2>&1 
mail -s "Download Successfull" [email protected] <<< "Files Successfully Downloaded" 
mail -s "Error: Download Failed" [email protected] <<< "Error:file download Failed!" 

這也是在你的腳本,在您使用其他版本的導致問題

在這裏,管道之前沒有命令,所以它根本沒有任何意義(並且你得到一個shell語法錯誤)。只需刪除管道。

現在,關於成功/失敗測試:您似乎使用success作爲命令,但它不是一個。您可以使用命令要檢查的直接的成功爲if條件:

if scp ...; then 
    echo "It worked!" 
else 
    echo "It failed!" 
fi 

,或者使用shell變量$?返回的最後一個命令的退出狀態(成功= 0,失敗=別的):

scp ... 
if [ $? -eq 0 ]; then 
    ... 

這裏有一個細微之處,很容易錯過:if後的事情是一個命令,但在第二個形式,它似乎是一個邏輯表達式(測試$?是否等於0)。祕密在於[實際上是一個評估邏​​輯表達式的命令,然後根據表達式是真還是假來成功或失敗地退出。不要將[ ]誤認爲某種括號或其他分組操作符,這不是這裏發生的事情!

順便說一下,Korthrun使用的[[ ]]形式與[ ]非常相似,但不受更多基本shell的支持。它確實避免了[ ]的一些令人討厭的語法異常,所以如果您使用bash這是一個好方法。

此外,請注意$?給出了最後執行的命令的狀態,因此它會被執行的每一條命令重置。例如,這是不行的:

scp ... 
echo "scp's exit status was $?" 
if [ $? -eq 0 ]; then  # Don't do this!!!! 

...因爲if然後看echo命令,不scp的退出狀態!如果你需要做這樣的事情,請將狀態存儲在一個變量中:

scp ... 
scpstatus=$? 
echo "scp's exit status was $scpstatus" 
if [ $scpstatus -eq 0 ]; then