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.

22
demandé sur JohnnyFromBF 2012-05-04 15:41:44

8 réponses

#!/bin/bash

RC=1

while [ $RC -eq 1 ]
do

  #do something until it returns 0    

  RC=$?
done
9
répondu Eugen Rieck 2012-05-04 11:44:25

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.

87
répondu Dennis Williamson 2017-05-23 12:32:27

false renvoie toujours un code de sortie de 1.

#!/bin/bash
false
while [ $? -eq 1 ]
do
#do something until it returns 0    
done
16
répondu chepner 2012-05-04 12:56:23

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.

6
répondu chukko 2015-05-06 17:15:16

je pense que vous pouvez le faire implicitement en lançant une commande qui est garantie d'échouer, avant d'entrer le while boucle.

la commande canonique est, bien sûr,false.

4
répondu unwind 2012-05-04 13:19:57

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
1
répondu David K 2012-05-04 11:50:42

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'à.

1
répondu don provan 2015-07-16 16:55:19

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
0
répondu Steven Kearnes 2013-08-12 18:24:34