如何在脚本中使用字符 + 、 - 、 x 、 / 作为参数

如何在脚本中使用字符 + 、 - 、 x 、 / 作为参数

我正在尝试编写一个名为 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

如果您使用的是bashshell,您可以尝试:

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实现通过运算符内置算术扩展,$((...))并使用更好的命令替换形式$(...)代替`...`

相关内容