İyi bilinen bir while condition; do ...; done
döngü var, ancak do... while
bloğun en az bir yürütülmesini garanti eden bir stil döngüsü var mı?
İyi bilinen bir while condition; do ...; done
döngü var, ancak do... while
bloğun en az bir yürütülmesini garanti eden bir stil döngüsü var mı?
Yanıtlar:
A'nın çok yönlü bir versiyonu do ... while
bu 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- i
16 olarak ayarlanan satırı yorumlar, i=16
döngü 4 kez yürütülür.
İçin i=16
, i=17
, i=18
ve 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
set -e
koş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 &&
!
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