linux 整除命令,关于bash:如何在Linux shell中对变量进行除法?

当我在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变量的减法和除法,是通过从外壳程序调用Python(将int转换为float ...):stackoverflow.com/questions/8385627/

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

expr $x / $y

它抱怨的原因是因为它认为您尝试使用字母字符(即非整数)

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

echo $((x / y))

要么:

z=$((x / y))

echo $z

通过阅读有关bash的手册页,您可以了解很多内容。在提示符下键入man bash(q退出)

必须在此页面的某处指出,大多数(如果不是全部)GNU / Linux外壳程序仅执行整数运算。

我相信其他线程已经提到了它:

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

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

" $hours $minutes $seconds

引用Bash变量需要参数扩展

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

x=20

y=5

expr $x / $y

当然,Bash还具有算术运算符和特殊的算术扩展语法,因此无需将expr二进制??文件作为单独的进程来调用。您可以让外壳执行以下所有工作:

x=20; y=5

echo $((x / y))

有关所有详细信息,请参见Bash参考手册中的算术扩展和Shell算术。

这与取消引用无关,但在2013年不推荐使用内插和expr。

@sputnick你显然很困惑。请随时查阅字典。请参见取消引用和内插。

我已经听说过"插值"被用来指代其他人所谓的参数扩展。起初,我要说的是,继续取消对C和C ++代码的讨论,但是不,他们在Bash世界中也是如此。所以所有人都在谈论同一件事。 +1投票反对expr。

更好的词是扩展,但不取消引用。当我们使用指针时,会使用解引用,那不是这里的情况,那只是简单的变量。

@Prashant:在bash世界中,不知道tldp是一个很好的参考。

假设

x=50

y=5

然后

z=$((x/y))

这将正常工作。

但是,如果要在case语句中使用/运算符,则无法解析它。

6f267e909e5935d07b5d1ca9820b3846.png

在这种情况下,请使用简单的字符串,例如div或devide或其他名称。

看代码

您可以按以下方式使用命令替换:

z="$(expr $x / $y)"

echo"$z"

确保上面提到的空格

您合并了先前的答案,却做错了。他应该使用expr或$()语法。

应为z="$(expr $x $y)",后跟echo"$z"。$()不是bash表达式语法。这是命令替换。因此,在删除的注释中使用它的方式是正确的。但是,使用echo $z的方式不正确。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值