J'ai un script et je souhaite demander des 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é de nombreuses 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"; sleep 2; done
- tout ce que vous avez à faire est d'appuyer sur Ctr-C juste après (dans les deux secondes) leecho
travail est fait.until passwd || (( count++ >= 5 )); do echo "foo"; done
(bash uniquement, assurez-vous de mettre le compte à 0 si ce variable existe) Si vous en avez besoin pour sh simple, incrémentez le compteur dans le corps et utilisez []Vous devez tester à la
$?
place, qui est l'état de sortie de la commande précédente.passwd
sort avec 0 si tout a bien fonctionné, et non nul si le changement de mot de passe a échoué (mot de passe incorrect, incompatibilité de mot de passe, etc ...)Avec votre version backtick, vous comparez la sortie de passwd, ce qui serait des choses comme
Enter password
etconfirm password
et autres.la source
$?
?passwd
avec/bin/false
si vous avez une commande longue et compliquée dont vous ne voulez pas garder deux versions.Pour développer la réponse de @Marc B,
C'est une bonne façon de faire la même chose qui n'est pas spécifique à une commande.
la source
sudo
devant une commande, vous pouvez simplementsudo !!
exécuter la commande précédente avec les privilèges root.Vous pouvez utiliser une boucle infinie pour y parvenir:
la source
&& break
après ma commande de vérification au lieu du cas sélectionné.Si quelqu'un souhaite avoir une limite de nouvelles tentatives:
la source
until $(command)
est fondamentalement toujours faux. Utilisezuntil command
plutôt. Le$(...)
fait que la sortie decommand
soit elle-même exécutée en tant que commande et que l'état de sortie de cette commande secondaire correspond à ce que la boucle décide d'exécuter ou d'échouer; il est seulement s'il est pas stdout que l'état de sortie de la commande elle - même est pris en compte lors de la substitution de commande est présente.$command
n'est pas non plus un grand espace réservé - voir BashFAQ # 50 sur pourquoi l'utilisation de chaînes pour stocker des commandes est intrinsèquement peu fiable. Pourtant, c'est mieux qu'il ne l'était; downvote s'est rétracté.la source