我希望我的腳本執行其所有整數引數的乘積。我沒有執行回圈,而是嘗試用替換空格*然后計算操作。但是我得到了以下我不明白的結果:
#!/bin/bash
# product.sh
echo $(( ${*// /*} )) # syntax error with ./product.sh 2 3 4
args=$*
echo $(( ${args// /*} )) # ./product.sh 2 3 4 => outputs 24
第一個在使用中間變數時會產生錯誤是如何正常作業的?
uj5u.com熱心網友回復:
第一個是如何產生錯誤的:
來自Bash 參考手冊:
如果引數是'@'或'*',則將替換操作依次應用于每個位置引數
(強調我的)
也就是說,運算式${*// /*}替換了位置引數內的空格,而不是分隔位置引數的空格。該運算式擴展為2 3 4(在算術背景關系中使用時會產生語法錯誤),因為引數本身不包含空格。嘗試
./product '2 ' '3 ' 4
你會看到區別。
uj5u.com熱心網友回復:
在您的示例中,該值$*實際上不包含任何文字空格,因此${*// /*}不執行任何操作。
如果確實如此,這些星號將受到通配符擴展的影響,因此即使可行,執行替換的想法似乎也相當脆弱。
我將簡單地創建一個函式來處理引數,而不是依賴于替換的詭計——當引數之一是變數等時,這些往往會出現令人討厭的極端情況。
mul () {
case $# in
[01]) echo "$@";;
*) local n=$1; shift; echo $((n * $(mul "$@")));;
esac
}
uj5u.com熱心網友回復:
或使用printf,像這樣:
echo $(( $(printf '%s*' $*)1 ))
uj5u.com熱心網友回復:
您可以使用IFS:
#!/bin/bash
# product.sh
# set IFS to *
IFS='*'
# use IFS in output
echo "$*"
# perform arithmetic
echo "$(( $* ))";
輸出:
2*3*4
24
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/524814.html
標籤:重击代替
上一篇:Vim,退出當前檔案位置
