Bash
Shell 腳本與 bash 一起執行,但不與 sh 一起執行。為什麼以及如何解決它?
我有以下 shell 腳本,它總結了傳遞給它的所有參數(空格分隔):
sum=0 for arg in "$@"; do (( sum += arg )) done echo $sum
我已將其保存為
SumAll.sh
. 因此,它的功能應該如下:sh SumAll.sh 2 4 6 8 20
或者
bash SumAll.sh 1 -2 3 -3 -1
兩者都可以在我的本地電腦(MacBook)上執行,但是當我在 linux 伺服器上嘗試相同的操作時,執行腳本可以
bash
正常工作,但sh
不能正常工作。我收到以下錯誤:sum: '+=': No such file or directory sum: arg: No such file or directory
這是為什麼?我該如何解決?
算術評估
(( ... ))
是對實現的標準 POSIX shell 語法的擴展bash
。大多數sh
shell 無法理解該語法。改用算術替換:
sum=$(( sum + arg ))
在不實現非標準的 shell 中
(( ... ))
,您的(( sum += arg ))
命令將被解釋為嵌套子 shell,sum
使用兩個參數呼叫命令+=
和arg
。在 macOS 上,
sum
是一個計算文件校驗和的實用程序(請參閱 參考資料man sum
),以及無法找到的文件+=
(arg
這就是您收到該特定錯誤的原因)。