¿Cómo se puede ejecutar un comando en bash una y otra vez hasta tener éxito?
Tengo un script y quiero pedirle al usuario cierta información, pero el script no puede continuar hasta que el usuario complete esta información. El siguiente es mi intento de poner un comando en un bucle para lograrlo, pero no funciona por alguna razón:
echo "Please change password"
while passwd
do
echo "Try again"
done
He probado muchas variaciones del bucle while:
while `passwd`
while [[ "`passwd`" -gt 0 ]]
while [ `passwd` -ne 0 ]]
# ... And much more
Pero parece que no puedo hacerlo funcionar.
until passwd
do
echo "Try again"
done
o
while ! passwd
do
echo "Try again"
done
Para ampliar la respuesta de @Marc B,
$ passwd
$ while [ $? -ne 0 ]; do !!; done
Es una buena manera de hacer lo mismo que no es un comando específico.
Si desea hacer esto como un alias (felicitaciones a @Cyberwiz):
alias rr='while [ $? -ne 0 ]; do eval $(history -p !!); done'
Uso:
$ passwd
$ rr
En su lugar, debe probar $?
cuál es el estado de salida del comando anterior. passwd
sale con 0 si todo funcionó bien y con un valor distinto de cero si el cambio de contraseña falló (contraseña incorrecta, contraseña que no coincide, etc.)
passwd
while [ $? -ne 0 ]; do
passwd
done
Con su versión de acento grave, está comparando la salida de passwd, que sería cosas como Enter password
y confirm password
similares.
Si alguien busca tener un límite de reintentos:
max_retry=5
counter=0
until <YOUR_COMMAND>
do
sleep 1
[[ counter -eq $max_retry ]] && echo "Failed!" && exit 1
echo "Trying again. Try #$counter"
((counter++))
done