let vs expr vs shell中的双括号算法

Har*_*ikk 12 math shell arithmetic-expressions

当我第一次学习shell脚本时,我看到很多let用于基本算术的例子,但后来我发现有些环境不是let内置的,而是支持使用expr(尽管速度明显较慢).

但是,例如,在许多shell中也可以使用双括号来执行算术运算$((54 + 102)).

由于我正在编写一个可移植性的脚本,这提供了一个可能性的雷区; 目前我正在使用两个不同的包装函数(一个用于let和一个用于expr),并使用快速测试来决定在我的其余脚本中使用哪个.

无论如何,我想知道的是,是否有人可以澄清这三个算术命令(以及我错过的任何其他算法命令)的兼容性.我希望双括号形式可能足够普通,我可以放弃兼容性检查,但搜索是一件很难的事情,所以我决定来这里并要求确定.

只是要注意我只对常规算术感兴趣,我想我已经涵盖了我可能需要使用的几个大整数.

che*_*ner 7

$(( ... )) 在POSIX标准中定义,它可能是您需要的便携式.

  • `expr`是在POSIX标准之前的日期,从shell将除最基本功能之外的所有功能都留给外部程序来实现.我的理解是Solaris使用Bourne shell(原始的`sh`,而不是名称相同的POSIX shell)作为默认系统shell,但是它没有作为`/ bin/sh`安装,并且仍然可以在某些地方使用POSIX shell路径名称. (2认同)