W powłoce nie ma koncepcji zmiennej boolowskiej.
Zmienne powłoki mogą być tylko text
(ciągiem), a w niektórych przypadkach tekst ten może być interpretowany jako liczba całkowita ( 1
,0xa
, 010
, itd.).
Dlatego a flag=true
nie sugeruje żadnej prawdziwości ani fałszu skorupie.
Strunowy
To, co można zrobić, to albo porównać ciąg znaków, [ "$flag" == "true" ]
albo użyć zawartości zmiennej w niektórych poleceniach i sprawdzić ich konsekwencje , na przykład wykonać true
(ponieważ istnieje zarówno wywołany plik wykonywalny, jak true
i jeden wywołany false
) jako polecenie i sprawdzić, czy kod wyjścia tego polecenia wynosi zero (odnoszący sukcesy).
$flag; if [ "$?" -eq 0 ]; then ... fi
Lub krócej:
if "$flag"; then ... fi
Jeśli zawartość zmiennej jest używana jako polecenie, !
można użyć do negowania statusu wyjścia polecenia, jeśli między nimi ( ! cmd
) istnieje spacja , jak w:
if ! "$flag"; then ... fi
Skrypt powinien zmienić się na:
flag=false
while ! "$flag"
do
read x
if [ "$x" == "true" ]
then
flag=true
fi
echo "${x} : ${flag}"
done
Liczba całkowita
Użyj wartości liczbowych i rozszerzeń arytmetycznych .
W takim przypadku kod wyjścia $((0))
to 1
i kod wyjścia $((1))
to 0
.
W bash, ksh i zsh arytmetyka może być przeprowadzona wewnątrz ((..))
(zauważ, że $
brakuje początku).
flag=0; if ((flag)); then ... fi
Przenośna wersja tego kodu jest bardziej skomplikowana:
flag=0; if [ "$((flag))" -eq 0 ]; then ... fi # test for a number
flag=0; if [ "$((flag))" == 0 ]; then ... fi # test for the string "0"
W bash / ksh / zsh możesz zrobić:
flag=0
while ((!flag))
do
read x
[ "$x" == "true" ] && flag=1
echo "${x} : ${flag}"
done
Alternatywnie
Możesz „Odwrócić zmienną logiczną” (pod warunkiem, że zawiera wartość liczbową) jako:
((flag=!flag))
To zmieni wartość flag
na jedną 0
lub 1
.
Uwaga : przed opublikowaniem kodu jako pytania sprawdź błędy w https://www.shellcheck.net/ , wiele razy to wystarczy, aby znaleźć problem.