POSIX kabuk komut dosyasında ... yap ya da yap…


17

İyi bilinen bir while condition; do ...; donedöngü var, ancak do... whilebloğun en az bir yürütülmesini garanti eden bir stil döngüsü var mı?


Çok teşekkürler Shawn, cevabın seçilen cevap kadar hızlı olmasını beklemiyordum. Yani: seçim için teşekkürler.

Yanıtlar:


16

A'nın çok yönlü bir versiyonu do ... whilebu yapıya sahiptir:

while 
      Commands ...
do :; done

Bir örnek:

#i=16
while
      echo "this command is executed at least once $i"
      : ${start=$i}              # capture the starting value of i
      # some other commands      # needed for the loop
      (( ++i < 20 ))             # Place the loop ending test here.
do :; done
echo "Final value of $i///$start"
echo "The loop was executed $(( i - start )) times "

Olduğu gibi (için ayarlanmış bir değer yok i) döngü 20 kez yürütülür.
UN- i16 olarak ayarlanan satırı yorumlar, i=16döngü 4 kez yürütülür.
İçin i=16, i=17, i=18ve i=19.

İ aynı noktada (diyelim ki 26) ayarlanmışsa (başlangıç), komutlar yine de ilk kez çalıştırılır (loop break komutu test edilene kadar).

Bir süre test doğru olmalıdır (çıkış durumu 0).
Test bir until döngüsü için ters çevrilmelidir, yani: falsy (çıkış durumu 0 değil).

POSIX sürümünün çalışması için birkaç öğenin değiştirilmesi gerekir:

i=16
while
       echo "this command is executed at least once $i"
       : ${start=$i}              # capture the starting value of i
       # some other commands      # needed for the loop
       i="$((i+1))"               # increment the variable of the loop.
       [ "$i" -lt 20 ]            # test the limit of the loop.
do :;  done
echo "Final value of $i///$start"
echo "The loop was executed $(( i - start )) times "

./script.sh
this command is executed at least once 16
this command is executed at least once 17
this command is executed at least once 18
this command is executed at least once 19
Final value of 20///16
The loop was executed 4 times 

Eğer kullanırsanız Çıplak akılda set -ekoşul blok durdurma yürütme gitmiyor iken içeride başarısız şey: örn set -e; while nonexistentcmd; true; do echo "SHiiiiit"; exit 3; done-> olur böyle şeyler. Yani, bu kullanırsanız hata işleme yani zincir ile tüm komutları gerçekten dikkatli olmak zorunda &&!
Timo

17

Döngüye kadar bir do ... while veya do ... yoktur, ancak aynı şey şu şekilde yapılabilir:

while true; do
  ...
  condition || break
done

şu tarihe kadar:

until false; do
  ...
  condition && break
done

Kesme çizgilerinden herhangi birini döngülerden biriyle kullanabilirsiniz - true iken veya false olana kadar 'sonsuza dek' anlamına gelene kadar. Bu durumun mutlu-çıkışlı veya üzgün-çıkışlı olmasının bir süre veya ne kadar koruduğunu anlıyorum.
android.weasel
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.