Ada while condition; do ...; done
loop terkenal , tetapi apakah ada do... while
loop gaya yang menjamin setidaknya satu eksekusi blok?
Ada while condition; do ...; done
loop terkenal , tetapi apakah ada do... while
loop gaya yang menjamin setidaknya satu eksekusi blok?
Jawaban:
Versi yang sangat serbaguna do ... while
memiliki struktur ini:
while
Commands ...
do :; done
Contohnya adalah:
#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 "
Karena (tidak ada nilai yang ditetapkan untuk i
) loop dijalankan 20 kali.
UN-Mengomentari garis yang ditetapkan i
ke 16 i=16
, loop dijalankan 4 kali.
Untuk i=16
, i=17
, i=18
dan i=19
.
Jika saya diatur ke (katakanlah 26) pada titik yang sama (mulai), perintah masih dijalankan pertama kali (sampai perintah loop break diuji).
Tes untuk sementara waktu harus benar (status keluar dari 0).
Tes harus dibalik untuk loop sampai, yaitu: menjadi palsu (status keluar bukan 0).
Versi POSIX perlu beberapa elemen diubah untuk berfungsi:
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
sesuatu yang gagal di dalam blok kondisi sementara tidak akan menghentikan eksekusi: mis set -e; while nonexistentcmd; true; do echo "SHiiiiit"; exit 3; done
- - sial terjadi. Jadi, jika Anda menggunakan ini, Anda harus benar-benar berhati-hati dengan penanganan kesalahan yaitu rantai semua perintah dengan &&
!
Tidak ada do ... while atau do ... sampai loop, tetapi hal yang sama dapat dilakukan seperti ini:
while true; do
...
condition || break
done
untuk sampai:
until false; do
...
condition && break
done