我使用checkbashisms检查了我的脚本,并收到以下警告:
possible bashism in check_ssl_cert line 821 (test -a/-o):
if [ -n "${ALTNAMES}" -a -n "${COMMON_NAME}" ] ; then
primary -a primary对binary和primary的结果执行二进制运算。-a运算符优先于-o运算符。
为什么-a
和-o
被认为是不可携带的?
我使用checkbashisms检查了我的脚本,并收到以下警告:
possible bashism in check_ssl_cert line 821 (test -a/-o):
if [ -n "${ALTNAMES}" -a -n "${COMMON_NAME}" ] ; then
primary -a primary对binary和primary的结果执行二进制运算。-a运算符优先于-o运算符。
为什么-a
和-o
被认为是不可携带的?
Answers:
并不是说它不是可移植的,而是[
当传递超过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
我什至觉得它更清晰。
-a
和-o
[ "x$ALTNAMES" != x -a "x$COMMON_NAME" != x ]
(未指定仍然按照POSIX标准,但便携和可靠的),或者[ "${ALTNAMES:+x}${COMMON_NAME:+x}" = xx ]
因为它们是XSI扩展,所以可能无法实现。请参阅:http : //pubs.opengroup.org/onlinepubs/009695399/utilities/test.html