if
bash でブロックを記述する場合、 shellcheckは、&&
and||
を使用するよりも-a
andを使用することをお勧めし-o
ます。
なんで?それはより速いですか、それとも単にスクリプトをきれいに見せるためのスタイル上の好みですか?
私が受け取る特定のメッセージは次のとおりです。
^-- SC2166: Prefer [ p ] || [ q ] as [ p -o q ] is not well defined.
if
bash でブロックを記述する場合、 shellcheckは、&&
and||
を使用するよりも-a
andを使用することをお勧めし-o
ます。
なんで?それはより速いですか、それとも単にスクリプトをきれいに見せるためのスタイル上の好みですか?
私が受け取る特定のメッセージは次のとおりです。
^-- SC2166: Prefer [ p ] || [ q ] as [ p -o q ] is not well defined.
のPOSIX仕様test
から:
4 つの引数:
結果は未定です。
[OB XSI] [Option Start] XSI 準拠のシステムでは、プライマリと演算子の組み合わせは、前述の優先順位と結合規則を使用して評価されます。さらに、文字列比較バイナリ プライマリ「=」および「!=」は、どの単項プライマリよりも優先されます。【オプション終了】
したがってtest
、 を 3 つ以上の引数で使用する場合-a
(またはを使用し-o
ている場合は、それに依存している場合)、拡張されていない POSIX によって明示的に指定された動作はありません。
では、なぜそうなのか。変数の値によっては、パーサーが間違ったことを実行する可能性があるためです。
このようなことをするように人々がアドバイスしたことを覚えていますか?
if [ "x$foo" = "x$bar" ]; then ...
...それはばかげて古いですよね?実際、いいえ!foo=(
とbar=)
、そして誰かが次のようなコマンドを実行する場合を考えてみましょう:
if [ "$foo" -a "$bar" ]
それは次のように展開されます。
if [ ( -a ) ]
...そして、どのように解析するのでしょうか? まあ、それはグループ化演算子である可能性があります(はい、歴史的にそれらをサポートするように指定されていました)、非nulltest
かどうかをチェックします。または、との両方が空でない文字列である-a
かどうかをチェックすることもできます。あいまいです。このあいまいさが、と が推奨される構文ではなくなった理由です。(
)
-a
-o
では、交換はどのように見えますか?それ以外の:
[ "$foo" -gt "$bar" -a "$foo" -lt "$qux" ]
...次のように書きます。
[ "$foo" -gt "$bar" ] && [ "$foo" -lt "$qux" ]
...2 つのテスト式を閉じ、シェル構文を使用してそれらの出力を結合します。[
/はシェルの組み込みであるためtest
、外部コマンドとして実行する必要はありません。そのため、70 年代test
に/usr/bin/test
.