当我在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语句中使用/运算符,则无法解析它。
在这种情况下,请使用简单的字符串,例如div或devide或其他名称。
看代码
您可以按以下方式使用命令替换:
z="$(expr $x / $y)"
echo"$z"
确保上面提到的空格
您合并了先前的答案,却做错了。他应该使用expr或$()语法。
应为z="$(expr $x $y)",后跟echo"$z"。$()不是bash表达式语法。这是命令替换。因此,在删除的注释中使用它的方式是正确的。但是,使用echo $z的方式不正确。