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双括号算术的主要内容,如果未能解决你的问题,请参考以下文章

linux shell “(())” 双括号运算符使用

Linux中编写Shell脚本

Shell中的括号、双括号、方括号和双方括号

shell变量的替换

shell变量

let 与 expr Shell运算比较 let强强胜出