@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
我搜索了'if else bash',並且得到了大量相關結果。你的問題到底是什麼? – HFBrowning
@HFBrowning請參閱更新的問題我得到格式錯誤 –
您的'then'和'else'分支從管道開始;你不能這樣做。如果你想要變成一個有條件的管道,那麼管道需要放在'if'之前。我不記得你是否還需要在子外殼中包含整個有條件的'if' ...'else' ...'fi'塊。 –