En bash, comment définir un code de retour?
je veux définir une valeur de retour une fois donc, il va dans la boucle while:
#!/bin/bash
while [ $? -eq 1 ]
do
#do something until it returns 0
done
pour que cela fonctionne, je dois définir $? = 1
Au début, mais ça ne marche pas.
8 réponses
#!/bin/bash
RC=1
while [ $RC -eq 1 ]
do
#do something until it returns 0
RC=$?
done
vous pouvez définir un code de sortie arbitraire en exécutant exit
avec un argument dans un shell interne est exécuté.
$ (exit 42); echo "$?"
42
de Sorte que vous pouvez faire:
(exit 1) # or some other value > 0 or use false as others have suggested
while (($?))
do
# do something until it returns 0
done
Ou vous pouvez émuler un do while
boucle:
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
Soit de ceux garantir que la boucle est exécutée au moins une fois je pense que c'est ce que votre but est.
false
renvoie toujours un code de sortie de 1.
#!/bin/bash
false
while [ $? -eq 1 ]
do
#do something until it returns 0
done
certaines réponses reposent sur la réécriture du code. Dans certains cas, il peut être un code étranger que vous n'avez aucun contrôle sur.
Bien que pour cette question, il suffit de définir $? à 1, mais si vous avez besoin de définir $? à n'importe quelle valeur - la seule réponse utile est celle de Dennis Williamson.
une approche un peu plus efficace, qui ne donne pas naissance à un nouvel enfant (mais qui est aussi moins lente), est:
function false() { echo "$$"; return ${1:-1}; }
false 42
Note: la partie echo est là juste pour vérifier qu'elle fonctionne dans le processus actuel.
Serait quelque chose comme cela être ce que vous cherchez ?
#!/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
Vieille question, mais il y a une bien meilleure réponse:
#!/bin/bash
until
#do something until it returns success
do
:;
done
si vous êtes en boucle jusqu'à ce que quelque chose soit réussi, alors faites juste ce quelque chose dans la section jusqu'à. Vous pouvez mettre exactement le même code dans la section jusqu'à ce que vous pensiez que vous deviez mettre dans la section do/done. Vous n'êtes pas obligé d'écrire le code dans la section do/done et ensuite de transférer ses résultats sur le moment ou jusqu'à.
Vous pouvez utiliser until
gérer les cas où #do something until it returns 0
renvoie autre chose que 1 ou 0:
#!/bin/bash
false
until [ $? -eq 0 ]
do
#do something until it returns 0
done