不能在算术表达式中使用乘法

时间:2016-02-02 12:28:22

标签: linux bash shell ubuntu

#!/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$

如何解决此问题?

3 个答案:

答案 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

不完美,但更容易调试。