làm trong khi làm hoặc làm cho đến khi trong tập lệnh shell POSIX


16

Có một while condition; do ...; donevòng lặp nổi tiếng , nhưng có một do... whilevòng lặp phong cách đảm bảo ít nhất một lần thực hiện khối không?


Rất cám ơn Shawn, tôi không mong đợi câu trả lời sẽ trở thành câu trả lời được chọn nhanh như vậy. Vì vậy: cảm ơn sự lựa chọn.

Câu trả lời:


15

Một phiên bản rất linh hoạt của a do ... whilecó 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 ithành 16 i=16, vòng lặp được thực hiện 4 lần.
Đối với i=16, i=17, i=18i=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 

Lưu ý rằng nếu bạn sử dụng set -ebấ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 &&!
Timo

17

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

Bạn có thể sử dụng một trong hai dòng ngắt với một trong các vòng lặp - trong khi đúng hoặc cho đến sai chỉ có nghĩa là 'mãi mãi'. Tôi hiểu rằng nó duy trì trạng thái tạm thời hoặc cho đến khi có điều kiện thoát vui hoặc thoát buồn.
android.weasel
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.