POSIX sh条件における論理OR評価の予期しない結果

POSIX sh条件における論理OR評価の予期しない結果

次のようなifステートメントがあるとします。

if [ $(false) ]; then
    echo "?"
fi

これにより、「?」は印刷されません(条件が偽です)。ところで、次のような場合には「?!」が出力されますが、なぜでしょうか。

if [ $(false) -o $(false) ]; then
    echo "?!"
fi

ベストアンサー1

$(false)falseと評価されず、空の文字列を生成します。引用がないので、

if [ $(false) ]; then

次のように評価

if [ ]; then

[空の式は偽なので、これは偽です。

if [ $(false) -o $(false) ]; then

次のように評価

if [ -o ]; then

これいいえ-o演算子を使用すると、-o単一の文字列を含む式で評価されます。[これらの式はtrueなので、thenステートメントの一部がif実行されます。

バラよりPOSIX仕様test、特に:

演算子の優先順位と生成される戻り値を決定するために使用されるアルゴリズムは、テストする引数の数に基づいています。 (ただし、「[...]」形式を使用する場合は、最後のパラメータ<右角括弧>をアルゴリズムに含めないでください。)

次のリストでは、$ 1、$ 2、$ 3、および$ 4はテストするパラメータを示しています。

引数 0 個:
false(1) を終了します。
パラメータ1:
$ 1がnullでない場合はtrue(0)を返し、そうでない場合はfalseを返します。

test演算子は、2つ以上の引数が指定されている場合にのみ考慮されます。

コマンドの終了ステータスを条件として使用するには、コマンドの置き換えまたは次の項目に入れないでください[ ]

if false; then

そして

if false || false; then

また参考にしてくださいtest-a演算子は-o廃止され、信頼できません。;シェルの&&AND||演算子を使用する必要があります。例えば

if [ "$a" = b ] || [ "$a" = c ]; then

おすすめ記事