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
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
Yanıtlar:
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
cmdhist
bash kullanıyorsanız seçeneği işaretleyin?
while true; do sh /Users/myuser/bin/vpn ; done
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
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 ; done
ancak geri while true ; ...
İki nokta üst üste her zaman "doğrudur":
while :; do foo; sleep 2; done
: [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.
İfadeleri ayırmak için noktalı virgül kullanabilirsiniz:
$ while [ 1 ]; do foo; sleep 2; done
until
Komutu da kullanabilirsiniz :
until ((0)); do foo; sleep 2; done
Aksine o Not while
, until
uzun bir test koşulu sıfır değildir çıkış durumları gibi döngünün içindeki komutları yürütmek istiyorum.
Bir while
döngü kullanma :
while read i; do foo; sleep 2; done < /dev/urandom
Bir for
dö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.
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
&&
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.
Basit bir süreç izliyor kullanım için watch
yerine
Kullanma while
:
while true; do echo 'while'; sleep 2s; done
for
Dö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;
While döngüsünün bir koşuldan sonra durmasını istiyorsanız ve foo
bu 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. 1
Koşul karşılandığında çıkmak için komut dosyasını yazarsınız ve0
yeniden çalıştırılması gereken .
Örneğin, batch_update.py
bir veritabanında 100 satırı 0
güncelleyen ve güncellenecek daha fazla bilgi 1
varsa 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;
foo
koduyla komut çıkış 1
siz while döngüsü kırmak istediğinizde. Cevabımı bir örnekle güncelledim.
İ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.
ls -1 *.jpg
verm *.jpg
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