Shell

POSIX 測試和 -a

  • December 20, 2012

我用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 對 primary 和 primary 的結果執行二進制和。-a 運算符優先於 -o 運算符。

為什麼被-a認為-o是不可移植的?

與其說它不可移植,不如[說它在傳遞超過 4 個參數時是可靠的。

即使在 bash 中:

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

相關部分指出:

>4 個參數

結果未指定。

$$ OB XSI $$ $$ Option Start $$在符合 XSI 的系統上,應使用前面描述的優先級和關聯性規則來評估初級和運算符的組合。此外,字元串比較二元基元 ‘=’ 和 “!=” 應具有比任何一元基元更高的優先級。$$ Option End $$

-a並且-o應該被禁止。正確的方法是使用&&and || shell運算符:

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

我什至覺得它更清晰。

引用自:https://unix.stackexchange.com/questions/57840