如何在 Linux shell 中对变量进行除法?

当我像下面这样在 shell 中运行命令时,它返回一个 expr: non-integer argument错误。有人能给我解释一下吗?

$ x=20
$ y=5
$ expr x / y
expr: non-integer argument
402531 次浏览

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

expr $x / $y

它抱怨的原因是因为它认为您试图操作字母字符(也就是说非整数)

如果使用 Bash shell,可以使用表达式语法实现相同的结果:

echo $((x / y))

或者:

z=$((x / y))
echo $z

引用 Bash 变量需要扩展参数

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

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

当然,Bash 也有 算术运算符和一个特殊的 算术扩展语法算术扩展语法,因此不需要作为一个单独的进程调用 翻译二进制文件。您可以让 shell 像下面这样完成所有工作:

x=20; y=5
echo $((x / y))

我相信在其他文章中已经提到过:

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 $* }"; }

为什么不使用 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

我们假设一下

x=50
y=5

那么

z=$((x/y))

这个会正常工作的。 但是如果您想在 case 语句中使用/操作符,那么它就不能解析它。 enter code here 在这种情况下,可以使用简单的字符串,如 div 或 devide 等。 看看密码

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

read num1 num2
div=`echo $num1 / $num2 | bc -l`
echo $div