セミコロンやブレースの正しい組み合わせを思い付くのに問題があります。これを実行したいのですが、コマンドラインからのワンライナーとして:
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
whileの状態でsleepコマンドを使用することも可能です。ワンライナーをよりきれいに見せます。
while sleep 2; do echo thinking; done
コロンは常に「真」です:
while :; do foo; sleep 2; done
セミコロンを使用してステートメントを区切ることができます。
$ 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
非常に単純な無限ループ..:)
while true ; do continue ; done
あなたの質問からそれは次のようになります:
while true; do foo ; sleep 2 ; done
watch
代わりに、単純なプロセス監視を使用します
使用while
:
while true; do echo 'while'; sleep 2s; done
for
ループの使用:
for ((;;)); do echo 'forloop'; sleep 2; done
を使用Recursion
します(上記とは少し異なりますが、キーボード割り込みは停止しません)
list(){ echo 'recursion'; sleep 2; list; } && list;
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
ある条件の後でwhileループを停止し、foo
この条件が満たされたときにコマンドがゼロ以外を返す場合は、次のようにループを中断できます。
while foo; do echo 'sleeping...'; sleep 5; done;
たとえば、foo
コマンドがバッチで物事を削除している場合、削除するものが残っていないときに1を返します。
これは、何らかの条件が発生するまでコマンドを何度も実行する必要があるカスタムスクリプトがある場合にうまく機能します。1
条件が満たされた0
ときに終了し、再度実行する必要があるときに終了するスクリプトを記述します。
たとえばbatch_update.py
、データベース内の100行を更新し、更新する行0
がさらにある場合とそれ以上ない場合に返すPythonスクリプトがあるとします1
。次のコマンドを使用すると、更新の合間に5秒間スリープした状態で、一度に100行を更新できます。
while batch_update.py; do echo 'sleeping...'; sleep 5; done;
2つの実用的な例を挙げられれば(少し「感情」があります)。
これにより、「。jpg」で終わるすべてのファイルの名前がフォルダ「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
貢献しようとしているだけです。
これも試すことができます警告:これはすべきではありませんが、質問は終わりのない無限ループを求めているので...これがあなたがそれを行う方法です。
while [[ 0 -ne 1 ]]; do echo "it's looping"; sleep 2; done
do
とを使用する必要もありませんdone
。for
無限ループの場合、中括弧を使用すると読みやすくなります。例えば:
for ((;;)) { date ; sleep 1 ; }
これはとで機能しbash
ますzsh
。では動作しませんsh
。
そのループをバックグラウンドに置くこともできます(たとえば、リモートマシンから切断する必要がある場合)
nohup bash -c "while true; do aws s3 sync xml s3://bucket-name/xml --profile=s3-profile-name; sleep 3600; done &"