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.
5 answers
until passwd
do
echo "Try again"
done
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.
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.
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;
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
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