Bir komutu nasıl çalıştırabilirim ve çıkış kodunu daha az karakterle nasıl alabilirim?


13

Senaryolarımı şöyle yazardım:

some_command
while [ $? -ne 0 ] ; do
    sleep 1
    some_command
done

some_commandİki kez yazmak zorunda kaldığım her zaman beni rahatsız etti . Bir şekilde döngü testi bölümüne koyabilir miyim?

Yanıtlar:


20

some_commandTest koşulunuz olarak kullanabilirsiniz .

while ! some_command; do sleep 1; done

some_commandBir hata ile çıktığı sürece koşul doğru kalacaktır .

Veya ek kontroller yapmak istiyorsanız daha ayrıntılı bir yol:

while ! some_command
do 
    # add more if desired
    sleep 1
done

Tek astarlı olsa bile bu benimkinden daha iyi görünüyor ;-)
Anthon

OP, başarısızlık durumunda birkaç komut yürütmesi gerektiğinde birkaç satıra bölmek isteyebilir :)
John WH Smith

Çok satırlı yapmak için noktalı virgüllerde satır kesmemenizin bir nedeni yok.
Mark Stewart

1
... or writewhile ! some_command; do several; commands; sleep 1; done
ignis

12

Bu nedir untildöngü içindir:

until some_command
do    sleep 1
done

Bir whiledöngünün mantıksal olumsuzlamasıdır .

Spec diyor ki:

untilDöngü

  • untilDöngü sürekli bir yürütür bileşiği ile liste uzun bir yanı bileşik listesi sıfır olmayan bir çıkış durumu vardır.

  • Until döngüsünün biçimi aşağıdaki gibidir:

    bileşik listesi-1'e kadar
    bileşik-liste-2 yap
    tamam
  • Bileşik-list-1 yürütülmez ve karar verilen bir sıfır çıkış durumu, varsa untilkadar komut. Aksi takdirde, bileşik listesi-2 yürütülür ve işlem tekrarlanır.

4

Sadece şunları yapabilirsiniz:

false
while [ $? -ne 0 ] ; do
   sleep 1
   some_command
done

bunun dezavantajı vardır ama her zaman önce bir saniye

0 ile çıkmak için birkaç komuttan herhangi birinden çıkmak istiyorsanız şunları yapabilirsiniz:

while true; do
  if [ some_command ] ; then break ; fi
  if [ some_other_command ] ; then break ; fi
  sleep 1
done

tabii ki sadece some_command


5
İkinci örnek içermemelidir [ve ]komutlarının.
nyuszika7h

2

Ne while ! ...de until ...öncesinde POSIX.1-2001 onların kabuk ortamı dondu sistemlerde çalışır. Ancak, bunu yapar.

while :; do
    if some command; then
        break
    fi
    sleep 1
done

Toplam taşınabilirliğe ihtiyacınız yoksa, neden bir kabuk komut dosyası yazıyorsunuz? Perl'in Bash'ten daha müsait olması muhtemeldir.

sleep 1 while 0 != system qw(some command);

(Yukarıdaki gibi, sleepyalnızca komut başarısız olursa yürütülür.)

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.