2012-05-04 30 views
21

Tôi muốn thiết lập một giá trị trả về một lần để nó đi vào vòng lặp while:Trong bash, làm cách nào để đặt mã trả lại?

#!/bin/bash 
while [ $? -eq 1 ] 
do 
#do something until it returns 0  
done 

Để làm việc này tôi cần phải đặt $? = 1 ngay từ đầu, nhưng điều đó không làm việc.

Trả lời

8
#!/bin/bash 

RC=1 

while [ $RC -eq 1 ] 
do 

    #do something until it returns 0  

    RC=$? 
done 
4

Tôi nghĩ bạn có thể làm điều này bằng cách chạy ngầm một lệnh đó là bảo đảm để thất bại, trước khi vào while vòng lặp.

Lệnh như vậy chuẩn tắc là, tất nhiên, false.

+0

Lệnh được đảm bảo * không * được muốn ở đây: 'false'. – chepner

+0

@chepner D'oh! Cảm ơn, và cố định tất nhiên. – unwind

1

Điều gì đó như thế này có phải là điều bạn đang tìm kiếm không?

#!/bin/bash 
TEMPVAR=1 
while [ $TEMPVAR -eq 1 ] 
do 
    #do something until it returns 0 
    #construct the logic which will cause TEMPVAR to be set 0 then check for it in the 
    #if statement 

    if [ yourcodehere ]; then 
    $TEMPVAR=0 
    fi 
done 
15

false luôn trả về một mã trả về 1.

#!/bin/bash 
false 
while [ $? -eq 1 ] 
do 
#do something until it returns 0  
done 
81

Bạn có thể đặt một mã thoát tùy ý bằng cách thực hiện exit với một cuộc tranh cãi trong một subshell.

$ (exit 42); echo "$?" 
42 

Vì vậy, bạn có thể làm:

(exit 1) # or some other value > 0 or use false as others have suggested 
while (($?)) 
do 
    # do something until it returns 0  
done 

Hoặc bạn có thể emulate a do while loop:

while 
    # do some stuff 
    # do some more stuff 
    # do something until it returns 0  
do 
    continue # just let the body of the while be a no-op 
done 

Một trong những đảm bảo rằng các vòng lặp được chạy ít nhất một lần mà tôi tin là những gì bạn mục tiêu là.

+0

Phải là '$ (thoát 42); echo "$?"' –

+3

@ElliotChance: Ký hiệu đô la trong câu trả lời của tôi đại diện cho dấu nhắc và hoạt động như là. Những gì bạn đề xuất cũng sẽ hoạt động, nhưng không cần thiết. –

+0

hoàn toàn nên chấp nhận câu trả lời này !!! – Tony

0

Bạn có thể sử dụng until để xử lý trường hợp #do something until it returns 0 lợi nhuận một cái gì đó khác hơn 1 hoặc 0:

#!/bin/bash 

false 
until [ $? -eq 0 ] 
do 
#do something until it returns 0  
done 
5

Một số câu trả lời dựa vào viết lại mã. Trong một số trường hợp, nó có thể là một mã nước ngoài mà bạn không có quyền kiểm soát.

Mặc dù cho câu hỏi cụ thể này, vẫn đủ để đặt $? đến 1, nhưng nếu bạn cần đặt $? với bất kỳ giá trị nào - câu trả lời hữu ích duy nhất là câu trả lời của Dennis Williamson.

Một chút cách tiếp cận hiệu quả hơn, mà không đẻ trứng một đứa trẻ mới (nhưng là một cũng ít ngắn gọn), là:

function false() { echo "$$"; return ${1:-1}; } 
false 42 

Lưu ý: echo phần là có chỉ để xác minh nó chạy trong quá trình hiện tại .

1

Cũ câu hỏi, nhưng có một câu trả lời tốt hơn nhiều:

#!/bin/bash 
until 
    #do something until it returns success 
do 
    :; 
done 

Nếu bạn đang lặp cho đến khi một cái gì đó là thành công, sau đó chỉ cần làm điều đó một cái gì đó trong khi phần. Bạn có thể đặt chính xác cùng một mã trong phần cho đến khi bạn nghĩ rằng bạn phải đặt trong phần do/done. Bạn không bắt buộc phải viết mã trong phần do/done và sau đó chuyển kết quả của nó trở lại trong thời gian hoặc cho đến khi.

Các vấn đề liên quan