2012-05-04 6 views
21

que desea establecer un valor de retorno por lo que una vez que entra en el bucle while:En bash, ¿cómo establecer un código de retorno?

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

Con el fin de conseguir este trabajo necesito fijar $? = 1 al principio, pero eso no funciona.

Respuesta

8
#!/bin/bash 

RC=1 

while [ $RC -eq 1 ] 
do 

    #do something until it returns 0  

    RC=$? 
done 
4

Creo que se puede hacer esto de forma implícita mediante la ejecución de un comando que está garantizado para fallar, antes de entrar en el bucle while.

El comando canónico es, por supuesto, false.

+0

Se quiere un comando con la garantía de * fail *: 'false'. – chepner

+0

@chepner D'oh! Gracias, y arreglado por supuesto. – unwind

1

¿Algo como esto es lo que estás buscando?

#!/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 siempre devuelve un código de salida de 1.

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

Puede establecer un código de salida mediante la ejecución arbitraria exit con un argumento en un subnivel.

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

por lo que podría hacer:

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

o puede hacer 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 

Cualquiera de los que garantiza que el bucle se ejecuta al menos una vez que creo que es lo que su el objetivo es

+0

Debe ser '$ (salida 42); echo "$?"' –

+3

@ElliotChance: El signo de dólar en mi respuesta representa el mensaje y funciona tal como está. Lo que usted propone también funcionaría, pero no es necesario. ¡ –

+0

debería aceptar totalmente esta respuesta! – Tony

0

Puede utilizar until para manejar los casos en que #do something until it returns 0 vuelve algo distinto de 1 ó 0:

#!/bin/bash 

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

Algunas de las respuestas confían en volver a escribir el código. En algunos casos, podría ser un código extraño sobre el que no tiene control.

Aunque para esta pregunta específica, es suficiente establecer $? a 1, pero si necesita establecer $? a cualquier valor, la única respuesta útil es la de Dennis Williamson.

Un poco enfoque más eficiente, lo que no desovar un nuevo hijo (pero es un también menos conciso), es:

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

Nota: echo parte es allí sólo para verificar que se ejecuta en el proceso actual .

1

vieja pregunta, pero hay una respuesta mucho mejor:

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

Si está bucle hasta algo tiene éxito, entonces simplemente hacer que algo en el hasta la sección. Puede poner exactamente el mismo código en la sección hasta que estaba pensando que tenía que poner en la sección do/done. No está obligado a escribir el código en la sección do/done y luego transferir sus resultados al momento o hasta que lo haga.

Cuestiones relacionadas