Cómo se puede ejecutar un comando en bash hasta el éxito


Tengo un script y quiero pedirle al usuario alguna información, 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 lograr esto, 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 hacer que funcione.

Author: J V, 2011-03-11

5 answers

until passwd
do
  echo "Try again"
done
 283
Author: Erik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-19 12:09:57

Necesita probar $? en su lugar, que es el estado de salida del comando anterior. passwd sale con 0 si todo funciona bien, y no-cero si el cambio de contraseña falló (contraseña incorrecta, desajuste de contraseña, etc...)

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

Con su versión de backtick, está comparando la salida de passwd, que sería cosas como Enter password y confirm password y similares.

 67
Author: Marc B,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-11 14:50:02

Para elaborar la respuesta de @Marc B,

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

Es una buena manera de hacer lo mismo que no es específico de comandos.

 43
Author: duckworthd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-07-16 01:48:21
while [ -n $(passwd) ]; do
        echo "Try again";
done;
 7
Author: Andrés Rivas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-09 21:13:08

Puedes usar un bucle infinito

while true
do
  read -p "Enter password" passwd
  case "$passwd" in
    <some good condition> ) break;;
  esac
done
 2
Author: kurumi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-11 14:48:08