単一行のBash無限whileループの構文


635

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

while [ 1 ]
do
    foo
    sleep 2
done

4
改行をセミコロンに置き換えます。同じことがforループでも機能します。
トム

23
@トム:それはいつもうまくいくとは限らない。実行後は、セミコロンではなく最初のコマンドを使用する必要があります
Stefano Borini

回答:


1232
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

2
「コマンドプロンプトで(表示されているように)複数行として入力してから、上矢印で履歴を呼び出すと、1行で正しく区切られて表示されます。」私には当てはまりませんでした。
Vincent Scheib 2013年

@ VincentScheib、cmdhistbashを使用している場合はオプションを確認してください。
Alok Singhal 2013年

優秀な!Mavericks(Mac OS-X 10.9)で完全に動作し、vpnを実行し続けることができます。Openconnectは、悪いcookieエラーで数時間後に切断されます。私はシェルスクリプトでopenconnectコマンドを置くので、このCMDラインをsuコマンドは、rootになるために須藤、および使用: while true; do sh /Users/myuser/bin/vpn ; done
Blisterpeanuts

170

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

while sleep 2; do echo thinking; done

16
これは構文を変更するだけではなく、スリープにコマンドを実行します。前の回答では、コマンドはすぐに実行されました。ただ注意すべき点があります。
DanGordon 2016年

@DanGordon while echo thinking ; do sleep 2 ; done もちろん、[while]コマンドが失敗した場合、ループは終了するため、終了する必要がありwhile echo thinking || true ; do sleep 2 ; doneますが、次に戻りますwhile true ; ...
Brian Carcich

69

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

while :; do foo; sleep 2; done

15
なぜコロンは常に正しいのですか?
ユルゲンポール

8
@Pineapple Under the Sea:bashのmanページから:(セクションシェルビルトコマンド) : [arguments] 影響なし。コマンドは、引数を展開し、指定されたリダイレクトを実行するだけです。ゼロの終了コードが返されます。
エイドリアンW

2
:はシェル自体の一部であるため、この構文が推奨されます。
avner 2014

@analytikそれはプラスかマイナスですか?;-)
Brian Carcich

33

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

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

3
いつ、どのような理由で説明するので、私はこの答えが好きです。(セミコロン)が必要です。
AndreasGeo氏

29

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

until ((0)); do foo; sleep 2; done動作するようには思えません。無限に続く。
-030

11

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

while true ; do continue ; done

あなたの質問は次のようになります:

while true; do foo ; sleep 2 ; done

8

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

1
さて、&&ループ内での使用は他のすべての時間と同じです。最初の問題が発生した場合にのみ2番目の問題が発生する必要がありますか?&&それ以外の場合は;十分です。実際には、そのループの内容を短くシンプルに保ち、理想的には1つのコマンド、つまり関数またはスクリプトを保持する必要があります。
thecoshman 2015


6

使用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;

5

ある条件の後で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;

どのように終了しますか?
AK_

whileループを解除したい場合はfoo、コードを使用してコマンドを終了します1。例を挙げて回答を更新しました。
Yep_It's_Me 2018年

2

私が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

貢献しようとしています。


1
@JKnight-これらの例では、あなただけではls -1 *.jpgありませんかrm *.jpg
Kevin Fegan

2
どちらも無限ループではなく、whileループでもありません。
マリアン

2

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

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

なんでそんなことするの?
gniourf_gniourf 2017

2
質問を投稿したブライアン・ディーコンが無限ループのように望んでいたからです。これは、複数の方法皮膚にすべてです猫です
grepit
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.