Làm cách nào để chạy lệnh và nhận mã thoát của nó với ít ký tự hơn?


13

Tôi đã từng viết kịch bản của mình như thế này:

some_command
while [ $? -ne 0 ] ; do
    sleep 1
    some_command
done

Nó luôn làm tôi khó chịu khi tôi phải viết some_commandhai lần. Tôi có thể đặt nó bên trong phần kiểm tra vòng lặp bằng cách nào đó?

Câu trả lời:


20

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_commandthoá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

Cái này có vẻ tốt hơn của tôi, mặc dù nó là một lớp lót ;-)
Anthon

OP có thể muốn chia nó thành nhiều dòng nếu anh ta cần thực thi một số lệnh khi thất bại :)
John WH Smith

Không có lý do tại sao bạn không thể ngắt dòng tại dấu chấm phẩy để biến nó thành nhiều dòng.
Mark Stewart

1
... hoặc viếtwhile ! some_command; do several; commands; sleep 1; done
ignis 23/12/14

12

Đây là những gì untilvòng lặp dành cho:

until some_command
do    sleep 1
done

Đó là sự phủ định logic của một whilevòng lặp.

Thông số kỹ thuật nói:

các untilVòng

  • Các untilvò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
  • Các hợp chất-list-1 sẽ được thực thi, và nếu nó có một tình trạng không lối ra, các untillệ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.

4

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


5
Ví dụ thứ hai không nên bao gồm []xung quanh các lệnh.
nyuszika7h

2

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, sleepchỉ được thực hiện nếu lệnh thất bại.)

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.