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


180

時々、条件付きを作成するとき、コードが何もしないようにする必要があります。たとえば、ここでは、Bash $aが「10」より大きい場合は何もせず$a、「5」未満の場合は「1」を出力します。それ以外の場合は「2」を出力します。

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

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

回答:


340

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

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

bashマニュアルから:

:(コロン)
引数を拡張してリダイレクトを実行する以外に何もしません。戻り状況はゼロです。


3
@SaintHaxいいえ、実行されませんtrue。シェルに組み込まれており、何もしません。
Barmar

1
これはシェルに組み込まれ(正しい)、trueと同じようにtrue(ステータス0)を返します。BashはDevOps言語であり、:私のチームの誰かが書いた場合、彼らに変更してもらいます。
SaintHax

3
@SaintHax無条件のtrueコンテキストで誰かが使用した場合、私は彼らにそれを変更してもらいます。if true大丈夫、then true間違っているようです
Barmar

1
もちろん、のif ! condition; then do something; fi代わりに使用するようにコードを書き換えることもできますif condition; then :; else do something; fi
Barmar

仰るとおりです。この例は、複合条件を使用してif / elif / elseで記述でき、より適切です。
SaintHax

38

おそらく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

8
あなたは結果をテストし、両方のない場合truefalse効果的にはるかにスクリプトが懸念されると何-OPSありませんが、原則的に、彼らは可能性がありので、おそらくこの構文を受け入れる一部のシェルではフォーク:優れています。
dmckee ---元モデレーターの子猫2013

3
質問のタグはbashです。bashではtruefalse組み込みです。古い殻のために、truefalse、さらには:外部コマンドであるかもしれない(おそらくだけでは後者参照してくださいねかかわらず、非常に古い殻を)。
キース・トンプソン

6
:意図が何であるかがより明確であるという理由だけで私は好む
Freedom_Ben

9

no-opコマンドに関する元の質問には答えていませんが、「このブランチでは何もする必要がない」と思われる場合の多くの(ほとんどではない)問題は、このブランチが勝つようにロジックを再構築するだけで回避できます。発生しません。

OPの例を使用して、一般的なルールを示します

$ aが「10」より大きい場合は何もせず、$ aが「5」より小さい場合は「1」を出力し、それ以外の場合は「2」を出力します

一般的な条件を他のすべての条件に適用できるようにする$aため$a < 10、条件が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の再構築は確かに優れていますが、何もしない方法を検索するすべての人々に一般的なルールを与えたかったのです。)


5
誰かが何もしないことを望む理由の1つは、最初にコードを構造化するときに、不注意な副作用なしに「後で何かをここに追加する」という考えです。たとえば、if-then-else-fiを.bashrcに配置しecho "put stuff here"ている場合、それを配置 すると、ログイン以外の使用の一部(scpが壊れるなど)が中断され、空白/コメントのみが実行時エラーを引き起こします。
Aphoid
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.