为什么 expr 不能在 shell 脚本中对实数进行算术运算?

为什么 expr 不能在 shell 脚本中对实数进行算术运算?
a=10.5
b=11.8
c=`expr $a + $b | bc`
echo $c

执行后,它会显示类似这样的错误消息non-integer argument。为什么这不能使用执行算术运算expr

答案1

错误解释

错误与您输入以下内容相同:

$ expr 10.5 + 11.8
expr: non-integer argument

Expr 抱怨你给它输入了非整数。这是因为expr程序不是为非整数计算而设计的:

Expr 调用

操作数可以是整数,也可以是字符串。

  • expr作为标准错误生成,您的终端仅显示它
  • 但是当你使用 pipe 时|,pipe 只传输标准输出,而不是标准错误
  • 因为bc没有收到任何可以处理的内容,所以它根本没有给你任何输出,正如你在尝试发送任何内容(换行符除外)时看到的那样bc

    $ echo | bc
    

结果bc什么都没说。所以你在屏幕上看到你原来的命令,仍然只是expr通过标准错误发出的抱怨。

推荐

对于十进制计算,您可以使用bc一些方法来获取输入bc,例如使用此处的字符串:

$ bc <<< '10.5 + 11.8'
22.3

或者,使用变量:

$ a=10.5
$ b=11.8
$ c=$(bc <<< "$a + $b")
$ echo $c
22.3
  • $()命令替换
  • <<< string是 here-string 语法,将字符串内容发送到 stdin,bc 接收

答案2

info coreutils 'expr invocation'说:

16.4 `expr': Evaluate expressions
=================================

`expr' evaluates an expression and writes the result on standard
output.  Each token of the expression must be a separate argument.

   Operands are either integers or strings.  Integers consist of one or
more decimal digits, with an optional leading `-'.  `expr' converts
anything appearing in an operand position to an integer or a string
depending on the operation being applied to it.

但是,您可以使用bc

$ a=10.5 b=11.8 c=$(echo "scale=1;$a + $b" | bc -q );echo $c
22.3

相关内容