shell中的let vs expr vs双括号算术
Posted
技术标签:
【中文标题】shell中的let vs expr vs双括号算术【英文标题】:let vs expr vs double parenthesis arithmetic in shell 【发布时间】:2014-04-18 20:00:15 【问题描述】:刚开始学习shell脚本的时候,看到很多例子都是用let
做基本算术的,后来发现有些环境并没有把let
作为内置,但是支持使用expr
代替(虽然速度明显慢)。
但是,在许多 shell 中也可以使用双括号来执行算术运算,例如 $((54 + 102))
。
由于我正在为可移植性编写脚本,这会带来一个充满可能性的雷区;目前我正在使用两种不同的包装函数(一种用于let
,一种用于expr
)并使用快速测试来决定在我的脚本的其余部分中使用哪一种。
无论如何,我想知道是否有人可以澄清这三个算术命令中的每一个(以及我错过的任何其他命令)的兼容性。我希望双括号形式可能足够常见,以至于我可以放弃兼容性检查,但搜索起来很困难,所以我决定来这里询问一下。
请注意,我只对常规算术感兴趣,我想我已经介绍了我(可能)需要使用的几个大整数。
【问题讨论】:
【参考方案1】:$(( ... ))
是在 POSIX 标准中定义的,这可能是您需要的便携性。
【讨论】:
嗯,在那种情况下,它总是在 POSIX 标准中,任何不符合 POSIX 标准的常见 shell 环境?如果双括号几乎可以完成所有功能但速度要快得多,我们会有expr
似乎很奇怪。
expr
早于 POSIX 标准,当时 shell 将除了最基本的功能之外的所有功能都留给外部程序来实现。我的理解是 Solaris 使用 Bourne shell(原来的 sh
,不是同名的 POSIX shell)作为默认系统 shell,但它没有安装为 /bin/sh
,并且 POSIX shell 仍然可以在某些路径名下使用。 以上是关于shell中的let vs expr vs双括号算术的主要内容,如果未能解决你的问题,请参考以下文章