Câu trả lời:
Bạn đã có thể sử dụng some_command
như điều kiện thử nghiệm của bạn.
while ! some_command; do sleep 1; done
Điều kiện sẽ vẫn đúng miễn là some_command
thoát với một lỗi.
Hoặc một cách dài dòng hơn nếu bạn muốn thực hiện kiểm tra bổ sung:
while ! some_command
do
# add more if desired
sleep 1
done
while ! some_command; do several; commands; sleep 1; done
Đây là những gì until
vòng lặp dành cho:
until some_command
do sleep 1
done
Đó là sự phủ định logic của một while
vòng lặp.
Thông số kỹ thuật nói:
until
VòngCác until
vòng lặp sẽ tiếp tục thực hiện một hợp chất-list chừng nào khác hợp chất-list có một trạng thái thoát khác không.
Định dạng của vòng lặp cho đến khi như sau:
cho đến khi hợp chất-list-1 làm hợp chất-list-2 làm xong
until
lệnh hoàn thành. Mặt khác, danh sách ghép-2 sẽ được thực thi và quá trình lặp lại.Bạn chỉ có thể làm:
false
while [ $? -ne 0 ] ; do
sleep 1
some_command
done
Điều này có nhược điểm mặc dù nó luôn ngủ trước một giây
Nếu bạn muốn có thể thoát trên bất kỳ một số lệnh nào để thoát bằng 0, bạn có thể thực hiện:
while true; do
if [ some_command ] ; then break ; fi
if [ some_other_command ] ; then break ; fi
sleep 1
done
cái nào tất nhiên cũng hoạt động cho some_command
[
và ]
xung quanh các lệnh.
Cả while ! ...
cũng không until ...
hoạt động trên các hệ thống đóng băng môi trường shell của họ trước khi POSIX.1-2001. Điều này, tuy nhiên, không.
while :; do
if some command; then
break
fi
sleep 1
done
Nếu bạn không cần tổng số tính di động, tại sao bạn lại viết một kịch bản shell? Perl có nhiều khả năng có sẵn hơn Bash.
sleep 1 while 0 != system qw(some command);
(Như trên, sleep
chỉ được thực hiện nếu lệnh thất bại.)