Non esiste un concetto di variabile booleana nella shell.
Le variabili di shell potrebbe essere solo text
(una stringa), e, in alcuni casi, che il testo può essere interpretato come un intero ( 1
, 0xa
, 010
, ecc).
Pertanto, a flag=true
non implica affatto veridicità o falsità per il guscio.
Stringa
Quello che si potrebbe fare è un confronto di stringhe [ "$flag" == "true" ]
o usare il contenuto variabile in alcuni comandi e verificarne le conseguenze , come eseguire true
(perché ci sono sia un eseguibile chiamato true
che uno chiamato false
) come comando e verificare se il codice di uscita di quel comando è zero (riuscito).
$flag; if [ "$?" -eq 0 ]; then ... fi
O più breve:
if "$flag"; then ... fi
Se il contenuto di una variabile viene utilizzato come comando, a !
potrebbe essere utilizzato per negare lo stato di uscita del comando, se esiste uno spazio tra entrambi ( ! cmd
), come in:
if ! "$flag"; then ... fi
Lo script dovrebbe cambiare in:
flag=false
while ! "$flag"
do
read x
if [ "$x" == "true" ]
then
flag=true
fi
echo "${x} : ${flag}"
done
Numero intero
Usa valori numerici ed espansioni aritmetiche .
In questo caso, il codice di uscita di $((0))
è 1
e il codice di uscita di $((1))
è 0
.
In bash, ksh e zsh l'aritmetica potrebbe essere eseguita all'interno di un ((..))
(notare che $
manca l'inizio ).
flag=0; if ((flag)); then ... fi
Una versione portatile di questo codice è più contorta:
flag=0; if [ "$((flag))" -eq 0 ]; then ... fi # test for a number
flag=0; if [ "$((flag))" == 0 ]; then ... fi # test for the string "0"
In bash / ksh / zsh potresti fare:
flag=0
while ((!flag))
do
read x
[ "$x" == "true" ] && flag=1
echo "${x} : ${flag}"
done
In alternativa
Puoi "Invertire una variabile booleana" (a condizione che contenga un valore numerico) come:
((flag=!flag))
Ciò cambierà il valore di flag
a 0
o 1
.
Nota : verificare la presenza di errori in https://www.shellcheck.net/ prima di pubblicare il codice come una domanda, molte volte che è sufficiente per trovare il problema.