Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux Can';在算术表达式中不能使用乘法_Linux_Bash_Shell_Ubuntu - Fatal编程技术网

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=*]…