Linux Can';在算术表达式中不能使用乘法
以上是Linux Can';在算术表达式中不能使用乘法,linux,bash,shell,ubuntu,Linux,Bash,Shell,Ubuntu,以上是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:
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$
要传递
*
时,必须引用参数:
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$
bash中的
*
字符是特殊的,它返回一个文件列表。因此,除了您所期望的之外,您将获得大量文件,而不是2*3
如果在脚本顶部执行回显“$@”
,您将看到实际参数。在我的系统上,您可以得到:
./calculate.sh 2 \* 3
因此,我的
$var2
最终成为t.sh
,并导致语法错误。如果要传入保留字符,需要引用它:/calculate.sh2\*3
bash中的*
字符是特殊的,它返回一个文件列表。因此,除了您所期望的之外,您将获得大量文件,而不是2*3
如果在脚本顶部执行回显“$@”
,您将看到实际参数。在我的系统上,您可以得到:
./calculate.sh 2 \* 3
因此,我的
$var2
最终成为t.sh
,并导致语法错误。如果要传入保留字符,则需要引用它:/calculate.sh2\*3
其他人指出,问题在于字符*不是由shell解释的,无论是在终端还是脚本中。必须使用反斜杠使shell理解它实际上是字符“*”
这里有一个完整的解决方案。
请注意条件[$\35;-ne 3]
而不是[$\35;-le 3]
,以及条件[$OP='\*']
而不是else
。让未经请求的案件审理是非常不好的做法。这样做可能会导致难以调试的情况,正如您现在所经历的那样
2 dump.xsl t.sh test.awk test.c test.cpp test.py test.sh 3
其中:
#!/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
虽然不完美,但调试起来要容易得多。正如其他人指出的那样,问题在于角色*不是由shell解释的,不管是在终端还是脚本中。必须使用反斜杠使shell理解它实际上是字符“*” 这里有一个完整的解决方案。 请注意条件
[$\35;-ne 3]
而不是[$\35;-le 3]
,以及条件[$OP='\*']
而不是else
。让未经请求的案件审理是非常不好的做法。这样做可能会导致难以调试的情况,正如您现在所经历的那样
2 dump.xsl t.sh test.awk test.c test.cpp test.py test.sh 3
其中:
#!/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
虽然不完美,但更容易调试。在
$OP
周围加上双引号,使用$(…)
$[…]
是一种过时的、不再有文档记录的、用于算术表达式的前置POSIX语法。在$OP
周围加上双引号使用$(…)
$[…]
是一种过时的、不再有文档记录的、用于算术表达式的POSIX前语法。除此之外,我必须在$OP周围加上双引号,否则问题仍然存在。除此之外,我必须在$OP周围加上双引号,否则问题仍然存在。虽然case
语句在这里看起来更自然。在乘法的情况下,您忘记了退出0。对星号进行引号和反斜杠的要求是一个错误。一个或另一个应该足够了。这可以通过在任何地方正确引用$OP
来解决;或者,如上所述,使用case
语句。另见@tripleee我从最初的海报问题开始,并试图得到类似的东西。感谢您的建议,我在脚本末尾添加了退出0。否则,我将只向expr发送参数。引用和转义星号是我的编码方式,这是你的喜好。我发现它更容易重读。非常迟的补充:为了避免错误消息[:太多的参数
,只需(正确地)在elif
中引用“$OP”
(当然还有“*”
)(例如elif[“$OP”=“*”)…
或者通过使用现代bash双括号语法特性来完全避免这个问题:elif[[$OP=*]]…
虽然case
语句在这里看起来更自然。您忘记了乘法中的退出0
。对星号进行引号和反斜杠的要求是一个错误。一个或另一个应该足够了。这可以通过正确地在任何地方引用$OP
来解决;或者如上所述,使用case
声明。另请参见@tripleee。我从最初的海报问题开始,并尝试获得类似的结果。感谢您的建议,我在脚本末尾添加了退出0。否则,我只会将参数发送到expr。引用和转义星号是我的编码方式,这是您的偏好。我发现它更容易重读。非常晚了添加:为了避免错误消息[:太多参数
,只需(正确地)在elif
中引用“$OP”
(当然还有“*”
)(例如elif[“$OP”=“*”])…
,或者使用现代的bash双括号语法特性完全避免问题:elif[$OP=*]…