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.
until passwd
do
echo "Try again"
done
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.
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?.
vous pouvez utiliser une boucle à l'infini
while true
do
read -p "Enter password" passwd
case "$passwd" in
<some good condition> ) break;;
esac
done
while [ -n $(passwd) ]; do
echo "Try again";
done;
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