【问题标题】:How can I do division with variables in a Linux shell?如何在 Linux shell 中对变量进行除法?
【发布时间】:2013-08-07 02:56:17
【问题描述】:

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

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

【问题讨论】:

  • @ShivanRaptor 虽然有人可能会争辩说这个问题是一个 RTFM 问题,但它肯定是一个有效的 shell 编程问题。对于来自不需要取消引用的语言(例如 Ruby 或 JavaScript)的人来说,这也是一个合理的问题。它应该保持打开状态。
  • @ShivanRaptor 不,这是这里的主题。这是关于在 Bash 中编程的。 Unix/Linux 主要是为了使用系统,而不是编程。现在,shell 脚本确实跨越了编程和使用系统之间的界限,因此这可能是任何一个站点的主题。如果有关于“我如何设置网络”的问题,那肯定属于 Unix/Linux。如果这是关于 Bash 中的交互式键绑定的问题,那也应该属于那里。但是关于 shell 脚本的问题肯定是这里和那里的话题。
  • 在这里查看我的答案,它说明了 $BASH 变量的减法和除法,使用从 shell 调用 Python(将 int 转换为 float ...):stackoverflow.com/questions/8385627/…

标签: linux bash shell variables division


【解决方案1】:

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

expr $x / $y

它抱怨的原因是因为它认为你试图对字母字符进行操作(ie 非整数)

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

echo $((x / y))

或者:

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

【讨论】:

  • 您可以通过阅读 bash 的手册页了解很多信息。在提示符处输入man bashq 退出)
  • 必须在此页面的某处指出,大多数(如果不是全部)GNU/Linux shell只执行整数运算
【解决方案2】:

我相信它已经在其他帖子中提到过:

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

【讨论】:

  • 你也可以使用echo '1 / 3' | bc -l
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    引用 Bash 变量需要参数扩展

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

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

    当然,Bash 也有arithmetic operators 和一个特殊的arithmetic expansion syntax,所以没有必要将expr 二进制文件作为一个单独的进程来调用。您可以让 shell 像这样完成所有工作:

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

    【讨论】:

    • 请参阅 Bash 参考手册中的 Arithmetic ExpansionShell Arithmetic 了解所有血腥细节。
    • 这与 dereferencing 无关,但在 2013 年不鼓励使用 interpolatingexpr
    • @sputnick 你显然很困惑。请随时查阅字典。见dereferenceinterpolate
    • 一个更好的词是expanding,而不是dereferencingdereferencing 是在我们使用指针的时候使用的,这里不是这样的,那只是简单的变量。
    • @Prashant:tldp 在 bash 世界中并不是一个很好的参考。
    【解决方案5】:

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

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

    【讨论】:

      【解决方案6】:

      假设

      x=50
      y=5
      

      然后

      z=$((x/y))
      

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

      【讨论】:

      • 这是错误的。 / 可以很好地用作外壳标签。不起作用的是使用 * 进行乘法而不引用它,这可能是您实际所做的; that 导致它有效地覆盖案例中的所有以下项目,在您的示例中为“devide”和“modulo”
      猜你喜欢
      • 2020-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-30
      • 1970-01-01
      • 2015-06-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多