Tek satırlı Bash sonsuz while döngüsü için sözdizimi


634

Noktalı virgül ve / veya ayraçların doğru birleşimini bulmakta güçlük çekiyorum. Bunu yapmak istiyorum, ancak komut satırından bir astar olarak:

while [ 1 ]
do
    foo
    sleep 2
done

4
yeni satırları noktalı virgülle değiştir Aynı şey döngüler için de geçerlidir.
Tom

23
@Tom: bu her zaman işe yaramaz. Yaptıktan sonra, noktalı virgül değil, ilk komuta sahip olmalısınız
Stefano Borini

Yanıtlar:


1231
while true; do foo; sleep 2; done

Bu arada, komut istemine çok satırlı (gösterdiğiniz gibi) yazar ve geçmişi yukarı okla çağırırsanız, doğru bir şekilde noktalanmış tek bir satıra alırsınız.

$ while true
> do
>    echo "hello"
>    sleep 2
> done
hello
hello
hello
^C
$ <arrow up> while true; do    echo "hello";    sleep 2; done

2
"komut istemine çok satırlı (gösterdiğiniz gibi) yazar ve geçmişi yukarı okla çağırırsanız, doğru bir şekilde noktalanmış tek bir satıra alırsınız." benim için doğru değildi.
Vincent Scheib

@VincentScheib, cmdhistbash kullanıyorsanız seçeneği işaretleyin?
Alok Singhal

Mükemmel! Mavericks (Mac OS-X 10.9) üzerinde mükemmel çalışır ve bir vpn'yi çalıştırmamı sağlar. Openconnect birkaç saat sonra kötü çerez hatasıyla kesiliyor. Bu yüzden bir kabuk betiğinde openconnect komutunu koydum, sudo su kök olsun ve bu cmd satırını kullan:while true; do sh /Users/myuser/bin/vpn ; done
Blisterpeanuts

170

Uyku durumunda komut komutunu kullanmak da mümkündür. Tek astarın daha temiz görünmesini sağlar.

while sleep 2; do echo thinking; done

16
Bu sadece sözdizimini değiştirmekten daha fazlasını yapar - uykudan sonra komutu yürütür . Önceki cevapta, komut hemen yürütülür. Dikkat edilmesi gereken bir şey.
DanGordon

@DanGordon while echo thinking ; do sleep 2 ; done Tabii ki [while] komutu başarısız olursa, döngü çıkar, bu yüzden yapmanız gerekir, while echo thinking || true ; do sleep 2 ; doneancak geri while true ; ...
dönersiniz

69

İki nokta üst üste her zaman "doğrudur":

while :; do foo; sleep 2; done

15
kolon neden hep doğrudur?
Jürgen Paul

8
@Pineapple Deniz Altında: Bash man sayfasından: (SHELL BUILTIN COMMANDS bölümünde) : [arguments] Etkisi yok; komut, bağımsız değişkenleri genişletmenin ve belirtilen yeniden yönlendirmeleri gerçekleştirmenin ötesinde hiçbir şey yapmaz. Sıfır çıkış kodu döndürülür.
Adrian W

2
bu sözdizimi şu şekilde önerilir: kabuğun kendisinin bir parçasıdır yani: bir kabuk yerleşik komutudur.
avner

@analytik, bunun bir artı mı yoksa eksi mi olduğunu mu söylüyorsunuz? ;-)
Brian Carcich

33

İfadeleri ayırmak için noktalı virgül kullanabilirsiniz:

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

3
Bu cevabı seviyorum çünkü ne zaman ve neden olduğunu açıklıyor; (noktalı virgül) gereklidir.
Bay AndreasGeo

29

untilKomutu da kullanabilirsiniz :

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

Aksine o Not while, untiluzun bir test koşulu sıfır değildir çıkış durumları gibi döngünün içindeki komutları yürütmek istiyorum.


Bir whiledöngü kullanma :

while read i; do foo; sleep 2; done < /dev/urandom

Bir fordöngü kullanma :

for ((;;)); do foo; sleep 2; done

Kullanmanın başka bir yolu until:

until [ ]; do foo; sleep 2; done

until ((0)); do foo; sleep 2; doneİşe görünmüyor. Sürekli sonsuz.
030

11

Çok basit bir sonsuz döngü .. :)

while true ; do continue ; done

Fr sorunuz olurdu:

while true; do foo ; sleep 2 ; done

8

Noktalı virgülleri yalnızca WHILE deyimi için kullanıyorum ve && operatörü döngüyü birden fazla şey yapmak için kullanıyor ...

Bu yüzden hep böyle yaparım

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
Döngüde kullanımı, &&diğer herhangi bir zamanla aynıdır, öyle değil. İkinci şeyin sadece ilk gerçekleşmesi durumunda olması gerekiyor mu, o zaman &&başka bir şey kullanmak ;yeterlidir. Gerçekten, bu döngünün içeriğini kısa ve basit tutmak, ideal olarak sadece bir komut, yani bir işlev veya bir komut dosyası tutmak istersiniz.
thecoshman


6

Kullanma while:

while true; do echo 'while'; sleep 2s; done

forDöngü kullanma :

for ((;;)); do echo 'forloop'; sleep 2; done

Kullanımı Recursion, (yukarıdakinden biraz farklı, klavye kesmesi durmaz)

list(){ echo 'recursion'; sleep 2; list; } && list;

5

While döngüsünün bir koşuldan sonra durmasını istiyorsanız ve foobu koşul gerçekleştiğinde komutunuz sıfırdan farklı bir değer döndürürse, döngünün şöyle kırılmasını sağlayabilirsiniz:

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

Örneğin, foo komut toplu olarak bir şeyleri siliyorsa ve silinecek hiçbir şey kalmadığında 1 döndürür.

Bazı koşullara kadar bir komutu birçok kez çalıştırmanız gereken özel bir komut dosyanız varsa bu iyi çalışır. 1Koşul karşılandığında çıkmak için komut dosyasını yazarsınız ve0 yeniden çalıştırılması gereken .

Örneğin, batch_update.pybir veritabanında 100 satırı 0güncelleyen ve güncellenecek daha fazla bilgi 1varsa ve daha fazlası yoksa dönen bir python komut dosyanız olduğunu varsayalım . Aşağıdaki komut, güncellemeler arasında 5 saniye uyku ile bir kerede 100 satırı güncellemenizi sağlar:

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

ve nasıl çıkardın?
AK_

Sen yapmak fookoduyla komut çıkış 1siz while döngüsü kırmak istediğinizde. Cevabımı bir örnekle güncelledim.
02:31

2

İki pratik örnek verebilirsem (biraz "duygu" ile).

Bu, "img" klasöründe ".jpg" ile biten tüm dosyaların adını yazar:

for f in *; do if [ "${f#*.}" == 'jpg' ]; then echo $f; fi; done

Bu onları siler:

for f in *; do if [ "${f#*.}" == 'jpg' ]; then rm -r $f; fi; done

Sadece katkıda bulunmaya çalışıyorum.


1
@JKnight - bu örnekler için, sadece yapmazdın ls -1 *.jpgverm *.jpg
Kevin Fegan

2
Her ikisi de sonsuz döngüler değil, döngüler değil.
Marian

2

Bunu da deneyebilirsiniz UYARI: Bunu yapmamalısınız, ancak soru sonu olmayan sonsuz döngü istediğinden ... bunu nasıl yapabileceğiniz budur.

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

Bunu neden yaptın?
gniourf_gniourf

2
çünkü soruyu yayınlayan Brian Deacon bir infinte loop gibi istemişti. Hepsi bir kediyi
ciltlemenin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.