[英]Bash passing array to expr
我正在BASH寫一個簡單的計算器。 它的目的是遍歷給定的參數,檢查它們是否正確,執行冪函數並將其余部分傳遞給expr進行計算。 除乘法之外的所有東西都有效。
當我做的事情
my_script.sh 2 \* 2
我從expr得到語法錯誤。 用bash -x檢查讓我知道
expr 2 '\*' 2
*是撇號。 我不知道如何擺脫它,所以expr可以正確解析它。
if [ $# -le 0 ]
then
usage
exit 1
fi
ARGS=("${@}")
while [ $# -gt 0 ]
do
if [ $OP -eq 0 ]
then
if [[ $1 =~ ^[-]{0,1}[0-9]+$ ]]
then
ELEMS[$J]=$1
shift
let OP=1
let J=$J+1
else
echo $1' is not a number'
usage
exit 3
fi
else
if [[ $1 =~ ^[-+/\^\*]{1}$ ]]
then
if [[ $1 =~ ^[\^]{1}$ ]]
then
if ! [[ $2 =~ ^[0-9]+$ ]]
then
echo 'Bad power exponent'
usage
exit 3
fi
let BASE=${ELEMS[$J-1]}
let EX=$2
pow $BASE $EX
let ELEMS[$J-1]=$RES
shift 2
else
if [[ $1 =~ [\*]{1} ]]
then
ELEMS[$J]=\\*
else
ELEMS[$J]=$1
fi
let J=$J+1
shift
let OP=0
fi
else
echo $1' is not an operator'
if [[ $1 =~ ^[0-9]+$ ]]
then
let TMP=${ELEMS[$J-1]}
echo "Are you missing an operator beetwen $TMP and $1?"
fi
usage
exit 3
fi
fi
done
if [ $OP -eq 0 ]
then
echo 'Missing argument after last operator'
usage
exit 3
fi
echo "Calculation: ${ARGS[*]}"
echo -n 'Result: '
expr ${ELEMS[*]}
將ELEMS[$J]=\\\\*
更改為ELEMS[$J]="*"
(或ELEMS[$J]=\\*
)並使用:
expr "${ELEMS[@]}"
關鍵是在數組解除引用中使用@
而不是*
,這允許您使用雙引號。 這相當於expr "2" "*" "2"
,而不是使用expr "${ELEMS[*]}"
時得到的expr "2 * 2"
expr "${ELEMS[*]}"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.