Thoát 1 khi vòng lặp kết thúc


0

Đây là bashkịch bản vòng lặp cho đến khi tôi cố thực thi lệnh ssh trên máy từ xa:

n=0
until [ ${n} -ge 5 ]
do
   ssh -oStrictHostKeyChecking=no root@test "mkdir -p /test_dir" && break 
   n=$(($n+1))
   sleep 5
done

Tôi muốn thực hiện thoát 1 khi vòng lặp kết thúc mà không thành công.

Tôi tìm thấy giải pháp này:

n=0
until [ ${n} -ge 5 ]
do
   ssh -oStrictHostKeyChecking=no root@test "mkdir -p /test_dir" && exit 0 
   n=$(($n+1))
   sleep 5
done
exit 1

Là cách chính xác?

Câu trả lời:


3

Đó là một cách.

Một cách khác là làm:

until [ "$n" -ge 5 ] && exit 1; do
  ... && break
done
echo OK
exit 0

Hoặc là:

while [ "$n" -lt 5 ] || exit; do
  ... && break
done

Mặc dù ở đây, có vẻ như bạn muốn lặp lại sshlệnh cho đến khi thành công và hủy bỏ sau rất nhiều lần thử, vì vậy:

n=5
until
  ssh -oStrictHostKeyChecking=no root@test "mkdir -p /test_dir"
do
  n=$((n - 1))
  if [ "$n" -eq 0 ]; then
    echo >&2 giving up
    exit 1
  fi
done

echo OK
exit 0

Sẽ có ý nghĩa hơn.


Tôi sẽ đề xuất một cái gì đó dọc theo dòng ví dụ cuối cùng của bạn. +1 cho điều đó
Fox

-1

Nếu bạn đang phân loại vòng lặp kết thúc "không thành công" như khi vòng lặp kết thúc vòng lặp thì có, sẽ có mã thoát là 1 khi điều này xảy ra.

Kịch bản bạn đã viết chỉ hoàn thành với mã thoát là 1. Nếu nó lặp lại mãi mãi thì rõ ràng bạn không bao giờ nhận được mã thoát là 1.

Tất cả các mã thoát là cho bạn biết sự thành công của lệnh chạy cuối cùng.

Nếu đoạn script trong bài viết của bạn kết thúc vòng lặp và kết thúc, hãy thử chạy nó ngay sau đó:

echo $?

Sau đó chạy echo $?lại. Bạn thấy gì? Tại sao bạn nghĩ rằng nó đã thay đổi? Bây giờ bạn có thể đã nhận được nó: thực tế là bạn đã chạy một lệnh thành công (trong trường hợp này echo, nó có thể là gần như mọi thứ) làm cho trạng thái thoát thay đổi thành không.


"Sau đó chạy echo $?lại". Đầu ra sẽ luôn bằng 0 nếu bạn chạy echo $?lại sau khi đã chạy echo $?trước đó.
GypsyCosmonaut

Đó là điểm của câu trả lời của tôi. Hãy thử đọc nó đúng cách. 'Tiếng vang $?' Đầu tiên hiển thị mã thoát khỏi tập lệnh (1) và 'echo $?' thứ hai hiển thị mã thoát từ 'echo $?' đầu tiên. Đọc câu trả lời của tôi đúng và bạn sẽ thấy.
bitofagoob
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.