Có một while condition; do ...; done
vòng lặp nổi tiếng , nhưng có một do... while
vòng lặp phong cách đảm bảo ít nhất một lần thực hiện khối không?
Có một while condition; do ...; done
vòng lặp nổi tiếng , nhưng có một do... while
vòng lặp phong cách đảm bảo ít nhất một lần thực hiện khối không?
Câu trả lời:
Một phiên bản rất linh hoạt của a do ... while
có cấu trúc này:
while
Commands ...
do :; done
Một ví dụ là:
#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 "
Vì nó là (không có giá trị được đặt cho i
) vòng lặp thực thi 20 lần.
UN - Nhận xét dòng đặt i
thành 16 i=16
, vòng lặp được thực hiện 4 lần.
Đối với i=16
, i=17
, i=18
và i=19
.
Nếu tôi được đặt thành (giả sử 26) tại cùng một điểm (bắt đầu), các lệnh vẫn được thực hiện lần đầu tiên (cho đến khi lệnh ngắt vòng lặp được kiểm tra).
Thử nghiệm trong một thời gian nên là sự thật (trạng thái thoát là 0).
Kiểm tra nên được đảo ngược cho một vòng lặp cho đến khi, tức là: bị sai lệch (trạng thái thoát không phải là 0).
Phiên bản POSIX cần một số yếu tố thay đổi để hoạt động:
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
bất cứ điều gì thất bại trong khối điều kiện while sẽ không dừng thực thi: vd set -e; while nonexistentcmd; true; do echo "SHiiiiit"; exit 3; done
-> shit xảy ra. Vì vậy, nếu bạn sử dụng điều này, bạn phải thực sự cẩn thận với việc xử lý lỗi, ví dụ như xâu chuỗi tất cả các lệnh với &&
!
Không có ... làm hay làm ... cho đến khi lặp, nhưng điều tương tự có thể được thực hiện như thế này:
while true; do
...
condition || break
done
cho đến khi:
until false; do
...
condition && break
done