Tengo un script y quiero pedirle información al usuario, 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 intentado muchas variaciones del ciclo while:
while `passwd`
while [[ "`passwd`" -gt 0 ]]
while [ `passwd` -ne 0 ]]
# ... And much more
Pero parece que no puedo hacer que funcione.
until passwd; do echo "Try again"; sleep 2; done
- todo lo que tiene que hacer es presionar Ctr-C justo después (dentro de los dos segundos dados)echo
hizo su trabajo.until passwd || (( count++ >= 5 )); do echo "foo"; done
(solo bash, asegúrese de establecer el recuento en 0 si existe esa variable) Si necesita esto para sh simple, incremente el contador en el cuerpo y use []En su
$?
lugar, debe probar , que es el estado de salida del comando anterior.passwd
sale con 0 si todo funcionó bien, y distinto de cero si el cambio de contraseña falló (contraseña incorrecta, falta de coincidencia de contraseña, etc.)Con su versión de backtick, está comparando la salida de passwd, que sería cosas similares
Enter password
yconfirm password
similares.fuente
$?
?passwd
con/bin/false
si tiene algún comando largo y complicado del que no desea conservar dos versiones.Para elaborar sobre la respuesta de @Marc B,
Es una buena manera de hacer lo mismo que no es un comando específico.
fuente
sudo
delante de un comando, simplemente puedesudo !!
ejecutar el comando anterior con privilegios de root.Puede usar un bucle infinito para lograr esto:
fuente
&& break
después de mi comando de verificación, en lugar del caso de selección.Si alguien busca tener límite de reintentos:
fuente
until $(command)
Básicamente siempre está mal. Usar en suuntil command
lugar. Esto$(...)
hace que la salida decommand
se ejecute como un comando y que el estado de salida de ese comando secundario sea el que el bucle decide ejecutar o fallar; es sólo si no es ninguna salida estándar que el estado de salida del comando en sí se considera cuando la sustitución de comandos está presente.$command
tampoco es un gran marcador de posición: vea BashFAQ # 50 sobre por qué el uso de cadenas para almacenar comandos no es confiable de manera innata. Aún así, esto es mejor de lo que era; voto negativo retraído.fuente