web-dev-qa-db-ja.com

単一行Bash infinite whileループの構文

セミコロンやブレースの正しい組み合わせが思い付かない。私はこれをやりたいのですが、コマンドラインからのワンライナーとして:

while [ 1 ]
do
    foo
    sleep 2
done
545
Brian Deacon
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
1051
Stefano Borini

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

while sleep 2; do echo thinking; done
153
Anssi

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

while :; do foo; sleep 2; done
64
ajaaskel

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
27
devnull

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

$ while [ 1 ]; do foo; sleep 2; done
25
mipadi

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

while true ; do continue ; done

あなたの質問から:

while true; do foo ; sleep 2 ; done
9
Mack

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
8
Thomas

単純なプロセス監視には、代わりにwatchを使用してください。

6

Whileループをある条件の後で停止させ、この条件が満たされたときにfooコマンドがゼロ以外の値を返す場合は、ループを次のように中断させることができます。

while foo; do echo 'sleeping...'; sleep 5; done;

たとえば、fooコマンドが一括してものを削除していて、削除するものがなくなったときに1を返します。

これは、何らかの状況が発生するまでコマンドを何度も実行する必要があるカスタムスクリプトがある場合にうまく機能します。条件が満たされたときに1で終了し、再度実行されるときに0で終了するようにスクリプトを作成します。

たとえば、データベース内の100行を更新し、更新するものがあればbatch_update.pyを、それ以上なければ0を返すPythonスクリプト1があるとします。次のコマンドでは、更新と更新の間に5秒間スリープしながら、一度に100行ずつ更新できます。

while batch_update.py; do echo 'sleeping...'; sleep 5; done;
3
Yep_It's_Me

私が2つの実用的な例を挙げることができるならば(少し「感情」で)。

これは、フォルダ "img"に ".jpg"で終わるすべてのファイルの名前を書き込みます。

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

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

2
Roger

あなたもこれを試すことができます。

while [[ 0 -ne 1 ]]; do echo "it's looping";   sleep 2; done
2
grepit

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;
1
msoliman