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
作为标准错误生成,您的终端仅显示它- 但是当你使用 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