【问题标题】:Multiplication with expr in shell script在 shell 脚本中与 expr 相乘
【发布时间】:2014-11-30 20:55:47
【问题描述】:

我正在制作一个基本的计算器来进行加减乘除。

加法有效,但乘法无效。当我尝试乘法时,我得到“您没有正确运行程序”响应:

$ ./calculator 4 + 5
9
$ ./calculator 4 * 5
You did not run the program correctly
Example: calculator 4 + 5

我在谷歌上四处搜索,找到了\\* 代码,但仍然不起作用。有人可以给我一个解决方案或解释吗?

这是我的代码

#!/bin/bash

if [ $# != 3 ]; then  
  echo You did not run the program correctly   
  echo Example: calculator 4 + 5                
  exit 1 
fi

if [ $2 = "+" ]; then    
  ANSWER=`expr $1 + $3`    
 echo $ANSWER 
fi

if [ $2 = "*" ]; then
  ANSWER=`expr $1 \\* $3`  
  echo $ANSWER 
fi

exit 0

【问题讨论】:

  • 你不太可能需要expr;例如,ANSWER=$(( $1 + $3 )) 应该适用于您可能在 Linux 中使用的任何 shell。

标签: linux bash shell unix expr


【解决方案1】:

您的代码有很多问题。这是一个修复。 * 表示“当前目录中的所有文件”。要改为表示文字星号/乘法字符,您必须对其进行转义:

./calculator 3 \* 2

./calculator 3 "*" 2

您还必须双引号 "$2",否则 * 将再次开始表示“所有文件”:

#!/bin/bash
#Calculator
#if [ `id -u` != 0 ]; then
#  echo "Only root may run this program." ; exit 1
#fi
if [ $# != 3 ]; then   
  echo "You did not run the program correctly"
  echo "Example:  calculator 4 + 5"
  exit 1
fi
# Now do the math (note quotes)
if [ "$2" = "+" ]; then echo `expr $1 + $3`
elif [ "$2" = "-" ]; then echo `expr $1 - $3`
elif [ "$2" = "*" ]; then echo `expr $1 \* $3`
elif [ "$2" = "/" ]; then echo `expr $1 / $3`
fi
exit 0

【讨论】:

    【解决方案2】:

    * 需要转义,因为它是 shell 语法中的特殊字符。 (如果没有转义,它将被扩展为当前目录中所有文件的列表)。但是你只需要使用一个反斜杠来转义它:

    ANSWER=`expr $1 \* $3` 
    

    【讨论】:

      【解决方案3】:

      对于两个元素:

      #!/bin/bash
      echo "Enter two numbers:"
      read a
      read b
      mult=`expr $a \* $b`
      echo "Multipication:" $mult
      

      对于数组:

      #!/bin/bash
      echo "Enter total numbers:"
      read n
      mult=1
      echo "Enter Numbers:"
      for (( i = 0; i < n; i++ ))
      do
      read a[i]
      mult=`expr $mult \* ${a[$i]}`
      done
      echo "Original numbers:" ${a[@]}
      echo "Multipication:" $mult
      

      【讨论】:

        猜你喜欢
        • 2011-02-15
        • 1970-01-01
        • 2013-01-20
        • 1970-01-01
        • 1970-01-01
        • 2010-10-22
        • 2012-02-20
        • 1970-01-01
        • 2012-10-16
        相关资源
        最近更新 更多