bash script: lệnh lặp lại nếu nó trả về lỗi


23

Tôi muốn tạo một vòng lặp lặp lại việc chuyển ncftp nếu nó trả về lỗi.

Tôi không chắc chắn làm thế nào biến biến mã thoát có thể được sử dụng trong một vòng lặp. Có công việc nào như vầy không?

until [$? == 0]; do
    ncftpput -DD -z -u user -p password remoteserver /remote/dir /local/file
done

Câu trả lời:


40

Tôi đã tìm thấy cơ sở cho vòng lặp thanh lịch này ở nơi khác trên serverfault. Hóa ra không cần lưu mã thoát, vì bạn có thể kiểm tra trực tiếp trên chính lệnh đó;

until ncftpput -DD -z -u user -p password remoteserver /remote/dir /local/file; do
  echo Tansfer disrupted, retrying in 10 seconds...
  sleep 10
done

8

Hầu hết. Bạn có thể tốt hơn là lưu giá trị trả về dưới dạng một biến để bạn có thể đặt trước nó trước vòng lặp. Nếu không, nó sẽ bị ảnh hưởng bởi lệnh chạy cuối cùng.

Bạn cũng có thể muốn quăng một cái sleepvào đó để ngăn chặn nó hồi sinh quá nhanh.

RET=1
until [ ${RET} -eq 0 ]; do
    ncftpput -DD -z -u user -p password remoteserver /remote/dir /local/file
    RET=$?
    sleep 10
done

Tôi nghĩ đã quên chuyển mã thoát sang biến RET, nhưng tôi hiểu ý. Câu hỏi chính của tôi là khi nào mệnh đề cho đến khi được đánh giá? Trong C, nó sẽ không được đánh giá cho đến sau lần chạy đầu tiên của vòng lặp, trong trường hợp đó vòng lặp của tôi sẽ hoạt động. Tuy nhiên, bạn vẫn tốt hơn vì nó cho phép các lệnh trung gian như ngủ. Cảm ơn!
Roy

Cũng phát hiện ra. Tôi đã chỉnh sửa nó. Điều khoản sẽ được đánh giá trước khi chạy đầu tiên. Vì vậy, trước đây nó sẽ sử dụng mã trả về của bất kỳ lệnh trước. Các đẳng thức kép không được Bash thi hành nhưng nó sử dụng tốt.
Dan Carley

== là cho sự bình đẳng chuỗi không phải là số, mặc dù tôi không nghĩ nó quan trọng trong trường hợp này ...
Kyle Brandt

Đơn và đôi bằng nhau. Nhưng sẽ tốt hơn nếu sử dụng đẳng thức số nguyên ngay bây giờ khi bạn đề cập đến nó.
Dan Carley

1
Bạn không cần kiểm tra số mã trả về - bạn chỉ có thể kiểm tra mã trả về của chính chương trình - cho đến khi chương trình; ngủ 3; làm xong .
chris

3

Bit hacky nhưng giải pháp của tôi là chỉ tạo một hàm bash tự chạy nếu nó bị lỗi

function retry { the_command_you_want && echo "success" || (echo "fail" && retry) }; retry

0

Bạn có thể thực hiện một vòng lặp trong khi lệnh của bạn trả về lỗi:

    while [ -n $(ncftpput -DD -z -u user -p password remoteserver /remote/dir /local/file) ]; do
            sleep 1;
    done;

3
Câu trả lời này cần giải thích.
kasperd

@kasperd giải thích thêm
Andrés Rivas
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.