web-dev-qa-db-ja.com

Bashの条件文で「何もしない」というコマンドは何ですか?

時々、条件を作成するとき、何もしないコードが必要です。たとえば、ここでは、$aが "10"より大きい場合はBashに何もさせず、$aが "5"より小さい場合は "1"を出力します。 」:

if [ "$a" -ge 10 ]
then
Elif [ "$a" -le 5 ]
then
    echo "1"
else
    echo "2"
fi

ただし、これはエラーになります。何もせず、スクリプトを遅くしないコマンドはありますか?

139
Village

Shellのno-opコマンドは:(コロン)です。

if [ "$a" -ge 10 ]
then
    :
Elif [ "$a" -le 5 ]
then
    echo "1"
else
    echo "2"
fi

bash manual から:

:(コロン)
引数の展開とリダイレクトの実行以外は何もしません。戻りステータスはゼロです。

273
Barmar

おそらくtrueコマンドを使用できます。

if [ "$a" -ge 10 ]; then
    true
Elif [ "$a" -le 5 ]; then
    echo "1"
else
    echo "2"
fi

別の方法として、あなたの例では(必ずしもどこでもない)if/elseの順序を変更します:

if [ "$a" -le 5 ]; then
    echo "1"
Elif [ "$a" -lt 10 ]; then
    echo "2"
fi
31
Flimzy

No-opコマンドに関する元の質問には答えていませんが、「このブランチでは何もしなくてはならない」と思われる多くの(ほとんどではないにしても)問題は、単にこのブランチが発生しないようにロジックを再構築します。

OPの例を使用して一般的なルールを与えようとします

$ aが「10」より大きい場合は何もせず、$ aが「5」より小さい場合は「1」を出力し、そうでない場合は「2」を出力する

$aが10を超えるブランチを回避する必要があるため、一般的な条件として$a < 10を他のすべての次の条件に適用できます。

一般的に、Xの場合は何もしないと言う場合、 X の分岐を避けるように言い換えます。通常、Xを否定し、それを他のすべての条件に適用することで、回避を実現できます。

したがって、ルールが適用されたOPの例は、次のように再構築できます。

if [ "$a" -lt 10 ] && [ "$a" -le 5 ]
then
    echo "1"
Elif [ "$a" -lt 10 ]
then
    echo "2"
fi

上記の単なるバリエーションで、すべてを$a < 10条件で囲みます。

if [ "$a" -lt 10 ]
then
    if [ "$a" -le 5 ]
    then
        echo "1"
    else
        echo "2"
    fi
fi

(この特定の例では @ Flimzys restructuring の方が確かに優れていますが、何もしない方法を探しているすべての人に一般的なルールを与えたいと思いました。)

9
Basti M