POSIX 测试和 -a

POSIX 测试和 -a

我检查了我的脚本制止主义我收到以下警告:

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

POSIX 规范第 4.62.4 节我发现

Primary -a Primary 对primary 和primary 的结果执行二进制运算。 -a 运算符优先于 -o 运算符。

为什么被认为是-a不可-o移植的?

答案1

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

即使在 bash 中:

$ ALTNAMES='='  bash -c '[ -n "${ALTNAMES}" -a -n "${COMMON_NAME}" ]'
bash: line 0: [: too many arguments

相关部分指出:

>4 个参数:

结果未明确。

[OB XSI] [Option Start] 在符合 XSI 的系统上,应使用前面描述的优先级和关联性规则来评估原色和运算符的组合。此外,字符串比较二进制主数“=”和“!=”的优先级应高于任何一元主数。 [选项结束]

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

if [ -n "$foo" ] && [ -n "$bar" ]; then

我什至发现它更清晰。

答案2

因为它们是 XSI 扩展,可能会也可能不会实现。看:http://pubs.opengroup.org/onlinepubs/009695399/utilities/test.html

相关内容