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 Iの発見

primary -a primaryバイナリを実行し、プライマリとプライマリの結果を実行します。-a演算子は-o演算子よりも優先されます。

なぜポータブルではない-a-o考えられますか?

回答:


11

移植性がないほどではありませんが[、4つ以上の引数が渡されたときに信頼できる実装はありません。

bashでも:

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

関連セクションは次のように述べています:

> 4引数

結果は不定です。

[OB XSI] [オプションの開始] XSI準拠のシステムでは、プライマリと演算子の組み合わせは、前述の優先順位と結合規則を使用して評価されます。さらに、文字列比較バイナリプライマリ '='および "!="は、どの単項プライマリよりも優先されます。【オプション終了】

-aそして-o禁止されるべきです。正しい方法は、代わりに&&and || シェル演算子を使用することです:

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

私もそれを読みやすくしています。


おかげで、唯一の解決策は2つのテストを行うことでしょうか?`if [-n" $ {ALTNAMES} "] && [-n" $ {COMMON_NAME}];
Matteo

3
ていないだけで 1確かに最善との代替として推奨-aして-o
ステファンChazelas

わかりました。ありがとうございました(単一のテストを行う方法がないことを意味しているだけです...)。
Matteo

1
はい、あなたが行うことができます[ "x$ALTNAMES" != x -a "x$COMMON_NAME" != x ](まだPOSIXあたりとして指定されていないが、ポータブル性と信頼性)、または[ "${ALTNAMES:+x}${COMMON_NAME:+x}" = xx ]
ステファンChazelas

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.