No existe el concepto de una variable booleana en el shell.
Las variables de shell sólo podían ser text
(una cadena), y, en algunos casos, que el texto puede ser interpretado como un entero ( 1
, 0xa
, 010
, etc.).
Por lo tanto, a flag=true
no implica veracidad o falsedad alguna para el caparazón.
Cuerda
Lo que se podría hacer es una comparación de cadenas [ "$flag" == "true" ]
o usar el contenido variable en algún comando y verificar sus consecuencias , como ejecutar true
(porque hay un ejecutable llamado true
y uno llamado false
) como un comando y verificar si el código de salida de ese comando es cero (exitoso).
$flag; if [ "$?" -eq 0 ]; then ... fi
O más corto:
if "$flag"; then ... fi
Si el contenido de una variable se usa como un comando, a !
podría usarse para negar el estado de salida del comando, si existe un espacio entre ambos ( ! cmd
), como en:
if ! "$flag"; then ... fi
El script debería cambiar a:
flag=false
while ! "$flag"
do
read x
if [ "$x" == "true" ]
then
flag=true
fi
echo "${x} : ${flag}"
done
Entero
Use valores numéricos y expansiones aritméticas .
En este caso, el código de salida de $((0))
is 1
y el código de salida de $((1))
is 0
.
En bash, ksh y zsh, la aritmética podría llevarse a cabo dentro de a ((..))
(tenga en cuenta que $
falta el inicio ).
flag=0; if ((flag)); then ... fi
Una versión portátil de este código es más complicada:
flag=0; if [ "$((flag))" -eq 0 ]; then ... fi # test for a number
flag=0; if [ "$((flag))" == 0 ]; then ... fi # test for the string "0"
En bash / ksh / zsh puedes hacer:
flag=0
while ((!flag))
do
read x
[ "$x" == "true" ] && flag=1
echo "${x} : ${flag}"
done
Alternativamente
Puede "Invertir una variable booleana" (siempre que contenga un valor numérico) como:
((flag=!flag))
Eso va a cambiar el valor de flag
que sea 0
o 1
.
Nota : compruebe si hay errores en https://www.shellcheck.net/ antes de publicar su código como una pregunta, muchas veces es suficiente para encontrar el problema.