1

ifシェルコマンドの使用方法を知っています。しかし、実際にはどのように機能するのでしょうか? オンラインで見つけたものはすべて、それがどのように使用されているかを説明しているだけです。

それはシェルの組み込み機能ですか、それとも私も自分で書くことができる通常のコマンドですか?

if echo "test"; then mkdir one; else mkdir two; fi

これは引数としてifコマンドを呼び出しますか? echo "test"次回thenまたはelseコマンドが実行されたときに、実際に実行するかどうかを決定できるように、結果を「記憶」しますか?

それとも、シェルはこのようなものを解析して直接実行しecho "test"ますか? もしそうなら、なぜ終端の or が必要なの;です\nか? thenキーワードをスキャンできませんか?

4

2 に答える 2

2

これは引数としてifコマンドを呼び出しますか? echo "test"次回thenまたはelseコマンドが実行されたときに、実際に実行するかどうかを決定できるように、結果を「記憶」しますか?

ifthen、およびelseはシェル キーワードであり、特殊なケースです。

または、シェルはこのようなものを解析し、エコー「テスト」を直接実行しますか? もしそうなら、なぜ終了が必要なのですか?または \n? then キーワードまでスキャンできませんでしたか?

コマンドへの引数が終了したことを認識できるように、コマンド ターミネータが必要です。それ以外の場合はthen、引数としてコマンドに渡されます。

于 2012-12-06T15:03:00.360 に答える
1

部分の前の最後の式の結果のみを使用しているように見えますthen:

if true;        then echo y; else echo n; fi    # y
if false;       then echo y; else echo n; fi    # n
if true; false; then echo y; else echo n; fi    # n
if false; true; then echo y; else echo n; fi    # y

結果 (つまり$?) がゼロの場合、thenパーツが実行され、それ以外の場合はパーツが実行されますelsetest ...[ ... ]、などの構成要素は[[ ... ]](( ... ))式を評価して true または false を返すため、ifステートメントで使用できます。

Bash のmanページには、if ステートメントの構文は次のとおりであり、「リストは、演算子、、、またはif list; then list; [ elif list; then list; ] ... [ else list; ] fiのいずれかで区切られた 1 つまたは複数のパイプラインのシーケンスであり、必要に応じて、 、またはのいずれかで終了します」と記載されています。;&&&||;&<newline>

これはシェルの組み込みであるため、おそらく何も「記憶」する必要はありません。原則my_ifとして、引数を実行した結果を保存し、 の場合にmy_thenのみ引数を実行し、 の場合truemy_elseのみ、独自の条件付き構造を作成できますfalse。ただし、これは簡単に悪用されたり、誤って使用される可能性がありますが、bash のifステートメントには非常に特殊な構文が必要です。

しかし、それでも のように動作させることはできませんでしたif。上記の例は次のようになります。

#my_if true; false; ...  # this wouldn't work since my_if ends at the first ;

my_if 'true; false;'; my_then echo y; my_else echo n; # and perhaps my_fi

my_if最後に、格納された状態の複雑な配列などを使用しない限り、(簡単に) s をネストすることはできません。

結論として、自分自身の一部を複製できる可能性がありifますが、すべてを複製することはできません。少なくとも、通常の よりも意味のある方法では使用できませんif

于 2012-12-06T15:35:20.940 に答える