正如@ fernand0建議,問題是||
和&&
符的優先級。您希望它運行類似mkdir || (echo && exit)
的東西 - 即,如果mkdir
失敗,則運行echo && exit
部件。但是它實際上做的是運行類似(mkdir || echo) && exit
的東西 - 也就是說,如果mkdir
或echo
命令成功,它將運行exit
部件。 echo
幾乎總會成功,所以它幾乎總是會退出。
因此,您需要明確地對命令進行分組,以覆蓋此優先級。但不要使用()
,因爲它在子shell中運行其內容,並且exit
將僅僅退出子shell,而不是主腳本;您可以改爲使用{ }
,也可以使用明確的if
塊。另外,您實際上不需要echo && exit
,因爲只有在echo
命令成功時才運行exit
。 echo
幾乎總是成功,但在罕見的情況下,它失敗了,我敢肯定你想腳本退出。
當我需要做這樣的事情在腳本中,我通常使用這個成語:
mkdir "$2" || {
echo "I can't create directory $2" >&2
exit 8
}
(注:如@CharlesDuffy建議,我加了周圍$2
雙引號 - 雙引號變量如果它們包含任何空格,通配符等,引用幾乎總是一個好主意。我也送錯誤消息到標準錯誤(>&2
),而不是標準輸出,這也是通常一個更好的方式來做事)
如果你想成爲更簡潔,你可以把它全部在一行。
mkdir "$2" || { echo "I can't create directory $2" >&2; exit 8; }
注意,最終;
(或換行)的}
之前需要,或shell認爲}
只是一個參數exit
。你也可以去其他的方式,並使用一個明確的if
塊:
if ! mkdir "$2"; then
echo "I can't create directory $2" >&2
exit 8
fi
這個選項是一樣聰明,簡潔的,但是這是一件好事 - 巧妙而簡潔的到底是什麼造成了首位這個問題;清晰明確的代碼更好。
我認爲這是因爲運營商的優先。你可以放圓括號。如果mkdir失敗,則執行echo並返回true,以便執行第三個命令。也許你可以使用括號 – fernand0
他是來自Unix和Linux SE的答案:https://unix.stackexchange.com/questions/88850/precedence-of-the-shell-logical-operators –