セミコロンやブレースの正しい組み合わせを思い付くことができません。私はこれをしたいのですが、コマンドラインからのワンライナーとして:
while [ 1 ]
do
foo
sleep 2
done
セミコロンやブレースの正しい組み合わせを思い付くことができません。私はこれをしたいのですが、コマンドラインからのワンライナーとして:
while [ 1 ]
do
foo
sleep 2
done
回答:
while true; do foo; sleep 2; done
ちなみに、コマンドプロンプトで(表示されているように)複数行として入力してから、上矢印キーで履歴を呼び出すと、1行で正しく区切られて表示されます。
$ while true
> do
> echo "hello"
> sleep 2
> done
hello
hello
hello
^C
$ <arrow up> while true; do echo "hello"; sleep 2; done
cmdhist
bashを使用している場合はオプションを確認してください。
while true; do sh /Users/myuser/bin/vpn ; done
whileの状態でsleepコマンドを使用することも可能です。ワンライナーをよりきれいに見せるイモにします。
while sleep 2; do echo thinking; done
while echo thinking ; do sleep 2 ; done
もちろん、[while]コマンドが失敗した場合、ループは終了するため、終了する必要がありwhile echo thinking || true ; do sleep 2 ; done
ますが、次に戻りますwhile true ; ...
コロンは常に「真」です。
while :; do foo; sleep 2; done
: [arguments]
影響なし。コマンドは、引数を展開し、指定されたリダイレクトを実行するだけです。ゼロの終了コードが返されます。
セミコロンを使用してステートメントを区切ることができます。
$ while [ 1 ]; do foo; sleep 2; done
until
コマンドを使用することもできます:
until ((0)); do foo; sleep 2; done
とは対照的にwhile
、until
テスト条件の終了ステータスがゼロでない限り、はループ内でコマンドを実行することに注意してください。
while
ループを使用する:
while read i; do foo; sleep 2; done < /dev/urandom
for
ループを使用する:
for ((;;)); do foo; sleep 2; done
別の使用方法until
:
until [ ]; do foo; sleep 2; done
until ((0)); do foo; sleep 2; done
動作するようには思えません。無限に続く。
WHILEステートメントにのみセミコロンを使用し、&&演算子を使用してループに複数の処理を実行させます...
だからいつもこうやって
while true ; do echo Launching Spaceship into orbit && sleep 5s && /usr/bin/launch-mechanism && echo Launching in T-5 && sleep 1s && echo T-4 && sleep 1s && echo T-3 && sleep 1s && echo T-2 && sleep 1s && echo T-1 && sleep 1s && echo liftoff ; done
&&
ループ内での使用は他のすべての時間と同じです。最初の問題が発生した場合にのみ2番目の問題が発生する必要がありますか?&&
それ以外の場合は;
十分です。実際には、そのループの内容を短くシンプルに保ち、理想的には1つのコマンド、つまり関数またはスクリプトを保持する必要があります。
watch
代わりに使用を監視する単純なプロセスの場合
ある条件の後でwhileループを停止させ、foo
この条件が満たされたときにコマンドがゼロ以外の値を返す場合は、次のようにループを中断できます。
while foo; do echo 'sleeping...'; sleep 5; done;
たとえば、foo
コマンドが一括で削除する場合、削除するものがなくなったときに1を返します。
これは、特定の状態になるまで何度もコマンドを実行する必要があるカスタムスクリプトがある場合にうまく機能します。1
条件が満たされた0
ときに終了し、再度実行するときに終了するスクリプトを記述します。
たとえばbatch_update.py
、データベースの100行を更新するPythonスクリプトがあり、更新0
するものが他にある場合とない場合に戻ります1
。次のコマンドを使用すると、更新の間に5秒間スリープして、一度に100行を更新できます。
while batch_update.py; do echo 'sleeping...'; sleep 5; done;
foo
、コードを使用してコマンドを終了します1
。例を挙げて回答を更新しました。
私が2つの実用的な例(少しの「感情」を伴う)を示すことができる場合。
これにより、「img」で終わるすべてのファイルの名前が「img」フォルダに書き込まれます。
for f in *; do if [ "${f#*.}" == 'jpg' ]; then echo $f; fi; done
これはそれらを削除します:
for f in *; do if [ "${f#*.}" == 'jpg' ]; then rm -r $f; fi; done
貢献しようとしています。
ls -1 *.jpg
ありませんかrm *.jpg
あなたもこれを試すことができます警告:これはすべきではありませんが、質問は無限ループのない無限ループを求めているので...これがあなたがそれを行う方法です。
while [[ 0 -ne 1 ]]; do echo "it's looping"; sleep 2; done