#!/bin/bash
if [ $# -lt 3 ] ;then
echo "USAGE : calculate.sh VAR1 OPERATOR VAR2"
exit 1
fi
VAR1=$1
OP=$2
VAR2=$3
if [ $OP = '+' ];then
echo "$VAR1+$VAR2=$[$VAR1+$VAR2]"
exit 0
elif [ $OP = '-' ];then
echo "$VAR1-$VAR2=$[$VAR1-$VAR2]"
exit 0
elif [ $OP = '*' ];then
echo "$VAR1*$VAR2=$[$VAR1*$VAR2]"
exit 0;
else
echo "$VAR1/$VAR2=$[$VAR1/$VAR2]"
fi
以上是calculate.sh
的内容。
如果我使用+
,-
或/
,我会得到正确答案,但当我使用*
时,会报告错误:
kdyzm@kdyzm:~/scripts$ ./calculate.sh 2 + 3 2+3=5 kdyzm@kdyzm:~/scripts$ ./calculate.sh 2 - 3 2-3=-1 kdyzm@kdyzm:~/scripts$ ./calculate.sh 2 * 3 ./calculate.sh: line 21: 2/command.sh: syntax error: invalid arithmetic operator (error token is ".sh") kdyzm@kdyzm:~/scripts$ ./calculate.sh 2 / 3 2/3=0 kdyzm@kdyzm:~/scripts$
如何解决此问题?
答案 0 :(得分:2)
如果要传递*
:
./calculate.sh 2 \* 3
答案 1 :(得分:2)
bash中的*
字符很特殊,正在返回文件列表。因此,除了2 * 3
之外,除了您期望的内容之外,您还会获得大量文件。
如果您在脚本顶部执行echo "$@"
,则会看到实际参数。在我的系统上,你得到:
2 dump.xsl t.sh test.awk test.c test.cpp test.py test.sh 3
因此我的$var2
最终成为t.sh
并导致语法错误。如果你想传入一个保留字符,你需要引用它:./calculate.sh 2 \* 3
答案 2 :(得分:0)
问题是其他人指出的事实,而不是字符*由你的shell解释,无论是在你的终端还是你的脚本中。你必须使用反斜杠来让shell明白它真的是字符' *'。
这是一个完整的解决方案。
请注意条件[ $# -ne 3 ]
而不是[ $# -le 3 ]
和条件[ $OP = '\*' ]
而不是else
。让未经审查的案件通过是非常糟糕的做法。这样做可能会导致您现在遇到困难的调试情况。
#!/bin/bash
if [ $# -ne 3 ]
then
echo "USAGE : calculate.sh VAR1 OPERATOR VAR2"
exit 1
fi
VAR1=$1
OP=$2
VAR2=$3
if [ $OP = '+' ]
then
echo "$VAR1+$VAR2 = "$(expr $VAR1 + $VAR2)
elif [ $OP = '-' ]
then
echo "$VAR1-$VAR2 = "$(expr $VAR1 - $VAR2)
elif [ $OP = '\*' ]
then
echo "$VAR1*$VAR2 = "$(expr $VAR1 \* $VAR2)
elif [ $OP = '/' ]
then
echo "$VAR1/$VAR2 = "$(expr $VAR1 / $VAR2)
else
echo "Operator must be +-*/"
exit 1
fi
exit 0
给出了:
adrien@adrienLT:~/Documents/PEV$ ./calculate.sh 6 '+' 5
6+5 = 11
adrien@adrienLT:~/Documents/PEV$ ./calculate.sh 6 '-' 5
6-5 = 1
adrien@adrienLT:~/Documents/PEV$ ./calculate.sh 6 '\*' 5
6*5 = 30
adrien@adrienLT:~/Documents/PEV$ ./calculate.sh 6 '/' 5
6/5 = 1
adrien@adrienLT:~/Documents/PEV$ ./calculate.sh 6 '*' 5
./calculate.sh: line 13: [: too many arguments
./calculate.sh: line 17: [: too many arguments
./calculate.sh: line 21: [: too many arguments
./calculate.sh: line 25: [: too many arguments
Operator must be +-*/
adrien@adrienLT:~/Documents/PEV$ ./calculate.sh 6 * 5
USAGE : calculate.sh VAR1 OPERATOR VAR2
不完美,但更容易调试。