POSIX测试和-a


9

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

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对binary和primary的结果执行二进制运算。-a运算符优先于-o运算符。

为什么-a-o被认为是不可携带的?

Answers:


11

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

即使猛击:

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

相关部分指出:

> 4个参数

结果不确定。

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

-a并且-o应该被禁止。正确的方法是使用&&|| 外壳运营商,而不是:

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

我什至觉得它更清晰。


谢谢,所以唯一的解决方案是进行两个测试?`if [-n“ $ {ALTNAMES}”] && [-n“ $ {COMMON_NAME}];
Matteo

3
并非只有一个,但肯定最好,并建议作为替代-a-o
斯特凡Chazelas

好的,非常感谢(只有我的意思是没有办法进行单个测试……)。
Matteo,2012年

1
是的,你可以这样做[ "x$ALTNAMES" != x -a "x$COMMON_NAME" != x ](未指定仍然按照POSIX标准,但便携和可靠的),或者[ "${ALTNAMES:+x}${COMMON_NAME:+x}" = xx ]
斯特凡Chazelas

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.