754

セミコロンやブレースの正しい組み合わせを思い付くのに問題があります。これを実行したいのですが、コマンドラインからのワンライナーとして:

while [ 1 ]
do
    foo
    sleep 2
done
4

14 に答える 14

1452
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
于 2009-08-17T16:32:32.533 に答える
194

whileの状態でsleepコマンドを使用することも可能です。ワンライナーをよりきれいに見せます。

while sleep 2; do echo thinking; done
于 2012-11-02T10:53:11.617 に答える
78

コロンは常に「真」です:

while :; do foo; sleep 2; done
于 2012-11-06T13:35:49.557 に答える
44

セミコロンを使用してステートメントを区切ることができます。

$ while [ 1 ]; do foo; sleep 2; done
于 2009-08-17T16:32:41.237 に答える
32

until次のコマンドを使用することもできます。

until ((0)); do foo; sleep 2; done

とは対照的にwhileuntilテスト条件の終了ステータスがゼロでない限り、はループ内でコマンドを実行することに注意してください。


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
于 2013-08-25T12:49:30.503 に答える
14

非常に単純な無限ループ..:)

while true ; do continue ; done

あなたの質問からそれは次のようになります:

while true; do foo ; sleep 2 ; done
于 2015-07-09T05:44:04.363 に答える
12

watch代わりに、単純なプロセス監視を使用します

于 2016-12-14T11:35:13.527 に答える
12

使用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;
于 2019-05-26T04:25:16.920 に答える
9

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
于 2011-01-29T10:43:48.297 に答える
7

ある条件の後で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;
于 2017-05-16T06:50:11.623 に答える
2

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

貢献しようとしているだけです。

于 2011-07-02T16:32:48.597 に答える
2

これも試すことができます警告:これはすべきではありませんが、質問は終わりのない無限ループを求めているので...これがあなたがそれを行う方法です。

while [[ 0 -ne 1 ]]; do echo "it's looping";   sleep 2; done
于 2017-02-07T20:47:56.883 に答える
2

doとを使用する必要もありませんdonefor無限ループの場合、中括弧を使用すると読みやすくなります。例えば:

for ((;;)) { date ; sleep 1 ; }

これはとで機能しbashますzsh。では動作しませんsh

于 2020-11-25T10:26:21.470 に答える
1

そのループをバックグラウンドに置くこともできます(たとえば、リモートマシンから切断する必要がある場合)

nohup bash -c "while true; do aws s3 sync xml s3://bucket-name/xml --profile=s3-profile-name; sleep 3600; done &"
于 2021-06-15T18:57:39.830 に答える