¿Cómo se puede ejecutar un comando en bash una y otra vez hasta tener éxito?

Resuelto J V asked hace 13 años • 7 respuestas

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.

J V avatar Mar 11 '11 21:03 J V
Aceptado
until passwd
do
  echo "Try again"
done

o

while ! passwd
do
  echo "Try again"
done
Erik avatar Mar 11 '2011 14:03 Erik

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
duckworthd avatar Jul 16 '2014 01:07 duckworthd

En su lugar, debe probar $?cuál es el estado de salida del comando anterior. passwdsale 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 passwordy confirm passwordsimilares.

Marc B avatar Mar 11 '2011 14:03 Marc B

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
aclowkay avatar Aug 11 '2019 08:08 aclowkay