ifを使用せずにbashから直接条件付き結果を印刷します。

ifを使用せずにbashから直接条件付き結果を印刷します。

次の簡単なコードがあるとしましょう。

echo "Are there any arguments?"
if [ $# -eq 0 ]; then
    echo "false"
else
    echo "true"
fi

ご覧のとおり、条件付き結果を直接印刷する機会があればいいのですが、どうすればよいかわかりません。

次のようになります。

echo "$([ $# -eq 0 ])"

しかしそれは真実ではない。なしでこれを行うことができますかif

答え1

この場合、リストを使用できます制御演算子 &&代わりに||:

[[ $# -eq 0 ]] && echo false || echo true

[[ $# -eq 0 ]] && { echo false; } \
               || { echo true; }

コマンドグループ{ }のリストは単一のコマンドにのみ必要ではありませんが、一般的にこれらの構造をより読みやすくします(リストにも終端文字や;改行文字が必要です)。

@Kusalanandaが指摘したように、これはechoコマンドが0( "true")を返す単純なコード(たとえば、上記は語彙的に似ていますが)で機能します。確かにCの段落評価と同じ意味を持つ。つまり:

(argc==1) && printf("false\n") || printf("true\n");  /* C, not bash */

ゼロ以外の状態を返すことができるコマンドの回避策は次のとおりです。

[[ $# -eq 0 ]] && { echo false;:; } || { echo true; }

:最初のリストの末尾にある追加の "null"コマンドは、0(true)状態を返すことを保証します(リストの戻り状態は、リストで実行された最後のコマンドの終了状態です)。

上記のロジックは、問題の一致を目的とした一般的な条件付きロジックテストとは反対ですが、一般的なロジックは次のとおりです。

[[ boolean-condition ]] && { true-actions;:; } || { false-actions; }

または、この例をより明確にするには、次のようにします。

[[ $# -eq 0 ]] && { echo no arguments;:; } || { echo found arguments; }

2つ(または他の定義された数の状態)がある場合は、Stéphaneの回答に示すように計算されたインデックス付きの配列を使用することもできます。

declare -a bool=([1]=true [0]=false)
echo ${bool[ (($# == 0)) ]}

または

temperature=70
declare -a porridge=([1]="too hot" [2]="just right" [3]="too cold")
echo ${porridge[ (( temperature >= 75 ? 1 :
                    temperature <= 68 ? 3 : 2 )) ]}

(( ))これは、通常のシェル規則とは異なり、0がfalseの算術式を使用します。

答え2

次のことができます。

bool=(false true)
echo "${bool[$# != 0]}"

(またはkshエミュレーションとksh93仮定)。bashzsh

すべてのPOSIXシェルでは、

echo "$(($# != 0))"

1Trueと0Falseが出力されます。

答え3

これを使用して、$?最後に実行されたコマンドの終了コードを保存できます。

echo "Are there any arguments?"
[ $# -eq 0 ]
echo $?

答え4

まだコメントすることができないので(過少代表される)、新しい回答でこれを指摘します。ミスタースピュラティックこのソリューションは、次のように単一の角かっこでも機能します。

[ $# -eq 0 ] && { echo false; } || { echo true; }

関連情報