#!/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
The above is the content of calculate.sh
.
If I use +
, -
, or /
, I get the correct answer, but when I use *
, it reports an error:
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$
How can I resolve this problem?
Advertisement
Answer
The problem was as pointed by others the fact than the character * is interpreted by your shell, be it in your terminal or your script. You must use backslash to make the shell understand it is really the character ‘*’.
Here is a complete solution.
Please, notice the condition [ $# -ne 3 ]
rather than [ $# -le 3 ]
and the condition [ $OP = '*' ]
rather than else
. It is very bad practice to let unasked cases to go through. Doing so may cause hard to debug situations as you have now experienced.
#!/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
Which gives :
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
Not perfect but much easier to debug.