POSIX 测试和 -a

Mat*_*teo 9 shell shell-script posix test

我用checkbashisms检查了我的脚本,并收到以下警告:

possible bashism in check_ssl_cert line 821 (test -a/-o):
if [ -n "${ALTNAMES}" -a -n "${COMMON_NAME}" ] ; then
Run Code Online (Sandbox Code Playgroud)

POSIX 规范的第 4.62.4 节中,我发现

主要 -a 主要 执行二进制和主要和主要的结果。-a 运算符优先于 -o 运算符。

为什么-a-o考虑非便携?

Sté*_*las 11

并不是说它不可移植,而是没有[实现在传递超过 4 个参数时它是可靠的。

即使在 bash 中:

$ ALTNAMES='='  bash -c '[ -n "${ALTNAMES}" -a -n "${COMMON_NAME}" ]'
bash: line 0: [: too many arguments
Run Code Online (Sandbox Code Playgroud)

相关部分指出:

>4 个参数

结果是不确定的。

[OB XSI] [Option Start] 在符合 XSI 的系统上,应使用前面描述的优先级和关联性规则评估原语和运算符的组合。此外,字符串比较二元基元 '=' 和 "!=" 应比任何一元基元具有更高的优先级。[选项结束]

-a并且-o应该被禁止。正确的方法是改用&&|| shell运算符:

if [ -n "$foo" ] && [ -n "$bar" ]; then
Run Code Online (Sandbox Code Playgroud)

我什至觉得它更易读。

  • 不是 _only_ ,但肯定是最好的,推荐作为 `-a` 和 `-o` 的替代品 (3认同)