Tôi đang xem xét một cách hiệu quả để làm điều này.
Tôi có nhiều lệnh khác nhau mà tôi cần phải thực hiện theo trình tự; cái thứ hai không thể chạy nếu cái thứ nhất thất bại và cứ thế.
Tôi đã lặp qua chúng; nhưng vòng lặp phải đi qua từng lệnh, đó không phải là điều tôi cần làm.
Chẳng hạn, nếu có 3 lệnh: a, b và c; a chạy mọi lúc, b chỉ chạy nếu a chạy thành công và c chỉ chạy nếu b chạy thành công, nhưng nếu b thất bại một lần, nó phải bắt đầu lại từ a
LOOP *****************************
until a; do
echo "a failed, retrying"
sleep(3)
done
until b; do
echo "b failed, need to start all over"
b_failed=1
break
START FROM THE BEGIN OF LOOP ***************
done
until c; do
echo "c failed, need to start all over from a"
c_failed=1
break
START FROM THE BEGIN OF LOOP ***************
done
.... OTHER INSTRUCTIONS
LOOP *****************************
Tôi đã cố gắng sử dụng một vòng lặp thông thường, nhưng giờ nghỉ sẽ thoát khỏi vòng lặp phụ và sẽ không bắt đầu lại từ đầu. Tôi muốn vào vòng lặp chính này, thực hiện thao tác đầu tiên cho đến khi nó vượt qua, sau đó thực hiện lần thứ hai; nếu thất bại, nó bắt đầu từ đầu vòng lặp, mà không chạy tất cả các lệnh khác, v.v. Mặc dù tôi dường như không thể tìm ra cách chính xác để làm như vậy, trừ khi tôi làm hỏng logic bằng một tấn if-if kiểm tra mọi lệnh.
Có một cách sạch sẽ để làm như vậy, trong vài dòng?
EDIT: đã viết trong khi thay vì cho đến khi; đã sửa
EDIT2: Cảm ơn rất nhiều cho giải pháp! Mặc dù nó phải được sửa đổi, vì tôi không thể chạy nó như hiện tại: if bị thiếu fi để chấm dứt lệnh và thiếu câu lệnh "then". Tôi đã không thể chạy việc bên trong nếu; Vì vậy, đây là những gì đang làm việc cho tôi:
while true; do
until a; do
echo "a failed, retrying"
sleep(3)
done
if [ ! b ]; then
echo "b failed, need to start all over"
continue
else
c
fi
if [ ! c ]; then
echo "c failed, need to start all over from a"
continue
else
break
fi
done
continue dòng để bắt đầu lại từ đầu.
whilelàm.whilelà một vòng lặp và hiện tại phần đầu tiên của bạn sẽ tiếp tục lặp lại "một thất bại, thử lại" cứ sau 3 giây miễn làalà thành công. Nó sẽ chỉ chuyển sangbkhi nàoathất bại