whileループがループ条件をどのように評価するかを知りたいです。マニュアルページには次のように記載されています。
そしてリスト-1を実行します。
while コマンドは、list-1 の最後のコマンドが終了ステータス 0 を返す限り、list-2 を実行し続けます。
そして
リスト
リストは&、&&または||演算子の 1 つで区切られ、オプションで;、&、 or のいずれかで終わる 1 つ以上のパイプシーケンス。
そして
管路
パイプは、制御演算子で区切られた1つ以上の命令シーケンスです。または|&。パイプの形式は次のとおりです。
[time [-p]] [ ! ] command [ [|⎪|&] command2 ... ]
これは次のことを意味します。
while <single-command>; do <list>; done;
有効な構文です。返されるとすぐにリストが<single-command>
実行されます0
。このようにwhileループを実行すると(明らかに)エラーが発生します。
$while aaa; do echo "foo"; done;
If 'aaa' is not a typo you can use command-not-found to lookup the package that contains it, like this:
cnf aaa
$while ; do echo "foo"; done;
Absolute path to '' is '/usr/sbin/', so running it may require superuser privileges (eg. root).
$while ""; do echo "foo"; done;
Absolute path to '' is '/usr/sbin/', so running it may require superuser privileges (eg. root).
驚くべきことに、一様変数をbar
asとして使用すると、<single-command>
無限ループが発生します。
$while $bar; do echo "foo"; done;
foo
foo
foo
...
bar
これは、get引数が空の文字列(?)に展開され、実行(?)され、常に0を返すことを意味します。しかし、なぜ私の2番目はそうではありませんか?エラー例平等な労働?楽しく:
$while "$bar"; do echo "foo"; done;
Absolute path to '' is '/usr/sbin/', so running it may require superuser privileges (eg. root).
動作しません。これは私の3番目のエラーの例に対応します。 $ barは空の文字列に展開され、エスケープされていない引用符は保持されます。
だから私の質問は:シェル(私の場合はbash)はどのように解釈しますか?
$while $bar; do echo "foo"; done;
コマンドによって無限ループが発生しますか?
修正する:
私は空のコマンド(何もせずに0を返します)をエミュレートするのは難しくないことに気づきました。空のコマンドはに対応します:
。したがって、終了しないwhileループは次のように書くことができます。
while :; do echo "foo"; done;
ベストアンサー1
このwhile
命令の後には、ループが必要かどうかを判断するために戻りコードを計算するコマンドが続きます。戻り値がある場合、実行は続行されます0
。
初期化されていない変数を参照するのは、""で初期化するのと同じです。
空のコマンドを実行してもエラーは発生しないため、適切な戻りコード(0
)が返されます。
$ foo=''
$ $foo
$ echo $?
0
これは通常の動作です。それ以外の場合は、何も入力せずにEnterキーを押すたびにシェルでエラーが発生します。
これは、シェルが問題として認識する空の文字列を指定するのとは異なります。
$ ''
-bash: : command not found
$ echo $?
127