do… while or do… hingga dalam skrip POSIX shell

16

Ada while condition; do ...; doneloop terkenal , tetapi apakah ada do... whileloop gaya yang menjamin setidaknya satu eksekusi blok?

Shawn J. Goff
sumber
Terima kasih banyak, Shawn, saya tidak mengharapkan jawaban menjadi jawaban yang dipilih begitu cepat. Jadi: terima kasih atas pilihannya.

Jawaban:

15

Versi yang sangat serbaguna do ... whilememiliki 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 ike 16 i=16, loop dijalankan 4 kali.
Untuk i=16, i=17, i=18dan 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 

sumber
Ingatlah bahwa jika Anda menggunakan set -esesuatu 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 &&!
Timo
17

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
Shawn J. Goff
sumber
Anda dapat menggunakan salah satu garis putus-putus dengan salah satu loop - sementara true atau sampai false hanya berarti 'selamanya'. Saya mengerti itu agak menjaga sementara atau sampai memiliki kondisi bahagia-keluar atau sedih-keluar.
android.weasel