我正在用BARH编写一个简单的计算器。其目的是循环访问给定的参数,检查它们是否正确,执行幂函数并将其余部分传递给 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"