我正在尝试编写一个名为 calc.sh 的脚本,该脚本使用脚本的参数($1、$2 和 $3)进行基本计算。例如,我想得到 2 作为 ./calc.sh 10 / 5 的结果
我的开始是这样的:
if [ $2 -eq "+" ] ; then res=`expr $1 + $3` ; echo "$res" ; fi
但它不起作用,我得到类似的东西:第 2 行:[ +:需要一个整数表达式
现在,我使用 == 进行比较,对于除除 / 之外的所有操作都可以正常工作。现在的代码是:
if [ $2 == "+" ] ; then res=`expr $1 + $3` ;
elif [ $2 == "-" ] ; then res=`expr $1 - $3` ;
elif [ $2 == "x" ] ; then res=`expr $1 \* $3` ;
elif [ $2 == "/" ] ; then res=`expr $1 \/ $3` ;
else res=`Operación no válida` ;
fi ; echo "$res"
但如果我尝试./calc.sh 10 / 5
,我会得到:“第 4 行:10 / 5 :语法错误:算术运算符无效(错误元素是“\ 5 ”)...唉,当我打字时,我意识到它应该是 $1 / 3 美元...
:)
答案1
如果您使用的是bash
shell,您可以尝试:
if [ $2 == "+" ] ;then
res=$(($1 + $3))
echo $res
fi
编辑
更改下一行(注意替换为'
by "
):
else res=`Operación no válida` ;
到:
else res="Operación no válida" ;
编辑2
if else
您可以使用 case 语句,而不是使用这么多语句:
case $2 in
+)
res=`expr $1 + $3`
;;
-)
res=`expr $1 - $3`
;;
/)
res=`expr $1 \/ $3`
;;
x)
res=`expr $1 \* $3`
;;
*)
res="Operación inválida"
;;
esac
echo "$res"
答案2
剧本:
#!/bin/sh
IFS=" " # join arguments with a space character
echo "$* = $(( $* ))"
有了+
它就很容易了:
./calc.sh 10 + 2
10 + 2 = 12
但星号必须转义
./calc.sh 10 \* 2
10 * 2 = 20
或者
./calc.sh 10 "*" 2
10 * 2 = 20
答案3
正如@AlexP 已经指出的那样,您正在执行算术而不是字符串比较。
我还强烈建议您使用双括号 [[]]
而不是单个的。
然后你的代码可以写成:
#!/bin/bash
if [[ $2 == "+" ]]; then
echo $(($1+$3))
elif [[ $2 == "/" ]]; then
echo $(($1/$3))
fi
执行示例:
./math.sh 2 + 7
9
./math.sh 7 / 2
3
答案4
+
、 、-
或x
都不是/
shell 或[
命令所特有的。你的问题是:
-eq
用于数字比较。使用=
而不是字符串比较- 你忘记引用你的变量
==
不是标准sh
[
运算符
所以:
if [ "$2" = + ]; then
res=`expr "$1" + "$2"`
fi
或者使用一个case
构造:
case $2 in
+ | - | /) res=`expr "$1" "$2" "$3"`;;
x) res=`expr "$1" "*" "$3"`;;
*) echo >&2 invalid; exit 1;;
esac
expr
请注意,只有在必须处理古代系统时才使用。现代标准sh
实现通过运算符内置算术扩展,$((...))
并使用更好的命令替换形式$(...)
代替`...`
。