web-dev-qa-db-fra.com

Comment pouvez-vous exécuter une commande dans bash jusqu'à ce que le succès

J'ai un script et je souhaite demander certaines informations à l'utilisateur. Le script ne peut pas continuer tant que l'utilisateur n'a pas renseigné ces informations. Ce qui suit est ma tentative de mettre une commande dans une boucle pour y parvenir mais cela ne fonctionne pas pour une raison quelconque.

echo "Please change password"
while passwd
do
echo "Try again"
done

J'ai essayé plusieurs variantes de la boucle while:

while `passwd`
while [[ "`passwd`" -gt 0 ]]
while [ `passwd` -ne 0 ]]
# ... And much more

Mais je n'arrive pas à le faire fonctionner.

202
J V
until passwd
do
  echo "Try again"
done
350
Erik

Vous devez plutôt tester $?, qui correspond à l'état de sortie de la commande précédente. passwd quitte avec 0 si tout a bien fonctionné et différent de zéro si le changement de mot de passe a échoué (mot de passe incorrect, mot de passe incorrect, etc ...)

passwd
while [ $? -ne 0 ]; do
    passwd
done

Avec votre version "backtick", vous comparez la sortie de passwd, qui pourrait être composée de Enter password et confirm password, etc.

81
Marc B

Pour élaborer sur la réponse de @Marc B,

$ passwd
$ while [ $? -ne 0 ]; do !!; done

Est-ce une bonne façon de faire la même chose sans commande particulière?.

55
duckworthd

vous pouvez utiliser une boucle à l'infini

while true
do
  read -p "Enter password" passwd
  case "$passwd" in
    <some good condition> ) break;;
  esac
done
5
kurumi
while [ -n $(passwd) ]; do
        echo "Try again";
done;
4
Andrés Rivas

Si quelqu'un cherche à avoir une nouvelle tentative limite:

max_retry=5
counter=0
until $(command)
do
   sleep 1
   [[ counter -eq $max_retry ]] && echo "Failed!" && exit 1
   echo "Trying again. Try #$counter"
   ((counter++))
done
1
aclokay