bash – Invertir variable booleana

Pregunta:

Quiero probar un guion simple

flag=false
while !$flag
do
   read x
   if [ "$x" -eq "true" ]
   then
     flag=true
   fi
   echo "${x} : ${flag}"
done

Pero cuando lo ejecuto, si escribo true , veré que x="true" y flag="true" , pero el ciclo no termina. ¿Qué pasa con el guión? ¿Cómo puedo invertir correctamente una variable booleana?

Respuesta:

Hay dos errores en su secuencia de comandos. ¡La primera es que necesitas un espacio entre ellos ! y $flag , de lo contrario el shell busca un comando llamado !$flag . El segundo error es que -eq es para comparaciones de enteros, pero lo está usando en una cadena. Dependiendo de su shell, verá un mensaje de error y el ciclo continuará para siempre porque la condición [ "$x" -eq "true" ] no puede ser verdadera, o cada valor no entero será tratado como 0 y el El bucle saldrá si ingresa cualquier cadena (incluido false ) que no sea un número diferente de 0.

! $flag Mientras ! $flag es correcto, es una mala idea tratar una cadena como un comando. Funcionaría, pero sería muy sensible a los cambios en su secuencia de comandos, ya que debe asegurarse de que $flag nunca pueda ser otra cosa que true o false . Sería mejor usar una comparación de cadenas aquí, como en la prueba a continuación.

flag=false
while [ "$flag" != "true" ]
do
   read x
   if [ "$x" = "true" ]
   then
     flag=true
   fi
   echo "${x} : ${flag}"
done

Probablemente haya una mejor manera de expresar la lógica que busca. Por ejemplo, puede hacer un bucle infinito y romperlo cuando detecte la condición de terminación.

while true; do
  read -r x
  if [ "$x" = "true" ]; then break; fi
  echo "$x: false"
done

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top

web tasarım