2012-05-04 35 views
21

我想設置一個返回值,所以一旦它進入while循環:在bash中,如何設置返回碼?

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

爲了得到這個工作,我需要在一開始設定$? = 1,但不起作用。

回答

8
#!/bin/bash 

RC=1 

while [ $RC -eq 1 ] 
do 

    #do something until it returns 0  

    RC=$? 
done 
4

我想你可以通過運行註定要失敗,進入while循環之前的命令隱含做到這一點。

典型的這樣的命令當然是false

+0

保證* fail *的命令在這裏需要:'false'。 – chepner

+0

@chepner D'oh!謝謝,當然固定。 – unwind

1

會是這樣的東西是你在找什麼?

#!/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總是通過在子shell參數執行exit返回1.

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

您可以設置任意退出代碼退出代碼。

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

所以,你可以這樣做:

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

或者你可以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 

那些要麼保證循環至少運行一次我相信這是你的目標是。

+0

應該是'$(出口42);回聲「$?「' –

+3

@ElliotChance:我的答案中的美元符號代表提示並按原樣工作,你提出的建議也可以工作,但沒有必要。 –

+0

應完全接受此答案! – Tony

0

您可以使用until來處理情況,比1或0其他#do something until it returns 0回報什麼情況:

#!/bin/bash 

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

一些答案依靠重寫代碼。在某些情況下,它可能是您無法控制的外部代碼。

雖然對於這個特定的問題,設置$就足夠了?到1,但如果你需要設置$?以任何價值 - 唯一有用的答案是丹尼斯威廉姆森的答案。

一點更有效的方法,它不產生一個新的子(而且是一個也不太簡潔),是:

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

注:回聲部分是有,只是爲了驗證它在當前的進程中運行。

1

老問題,但有一個更好的答案:

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

如果你循環,直到事情是成功的,那麼就做什麼的,直到一節。你可以在你認爲必須放入do/done部分的部分放入完全相同的代碼。您不必在do/done部分編寫代碼,然後將其結果傳回到while或until。