162

当我在我的 shell 中运行如下命令时,它会返回一个expr: non-integer argument错误。有人可以向我解释一下吗?

$ x=20
$ y=5
$ expr x / y 
expr: non-integer argument
4

6 回答 6

227

这些变量是shell变量。要将它们作为参数扩展到另一个程序(ie expr),您需要使用$前缀:

expr $x / $y

它抱怨的原因是因为它认为您正在尝试对字母字符(非整数)进行操作

如果您使用的是 Bash shell,则可以使用表达式语法获得相同的结果:

echo $((x / y))

或者:

z=$((x / y))
echo $z
于 2013-08-07T02:59:04.683 回答
44

我相信它已经在其他线程中提到过:

calc(){ awk "BEGIN { print "$*" }"; }

然后你可以简单地输入:

calc 7.5/3.2
  2.34375

在您的情况下,它将是:

x=20; y=3;
calc $x/$y

或者,如果您愿意,可以将其添加为单独的脚本并使其在 $PATH 中可用,这样您就可以始终在本地 shell 中使用它:

#!/bin/bash
calc(){ awk "BEGIN { print $* }"; }
于 2014-11-21T15:31:30.440 回答
23

为什么不使用 let;我觉得容易多了。这是一个您可能会发现有用的示例:

start=`date +%s`
# ... do something that takes a while ...
sleep 71

end=`date +%s`
let deltatime=end-start
let hours=deltatime/3600
let minutes=(deltatime/60)%60
let seconds=deltatime%60
printf "Time spent: %d:%02d:%02d\n" $hours $minutes $seconds

另一个简单的例子 - 计算自 1970 年以来的天数:

let days=$(date +%s)/86400
于 2015-04-29T03:01:25.407 回答
16

引用 Bash 变量需要参数扩展

大多数 Linux 发行版的默认 shell 是 Bash。在 Bash 中,变量必须使用美元符号前缀来进行参数扩展。例如:

x=20
y=5
expr $x / $y

当然,Bash 还具有算术运算符和特殊的算术扩展语法,因此无需将expr二进制文件作为单独的进程调用。您可以让 shell 像这样完成所有工作:

x=20; y=5
echo $((x / y))
于 2013-08-07T03:02:18.070 回答
5

要获取小数点后的数字,您可以这样做:-

read num1 num2
div=`echo $num1 / $num2 | bc -l`
echo $div
于 2019-11-09T14:45:24.917 回答
1

假设

x=50
y=5

然后

z=$((x/y))

这将正常工作。但是如果你想在 case 语句中使用 / 运算符,它就无法解决它。 在这里输入代码 在这种情况下,请使用简单的字符串,如 div 或 devide 或其他。查看代码

于 2018-08-23T06:59:55.977 回答