Tidak ada konsep variabel boolean di shell.
Variabel shell hanya bisa text
(string), dan, dalam beberapa kasus, teks yang dapat ditafsirkan sebagai integer ( 1
, 0xa
, 010
, dll).
Karena itu, a flag=true
tidak menyiratkan kebenaran atau kepalsuan pada cangkang sama sekali.
Tali
Apa yang bisa dilakukan adalah perbandingan string [ "$flag" == "true" ]
atau menggunakan konten variabel dalam beberapa perintah dan memeriksa konsekuensinya , seperti mengeksekusi true
(karena ada keduanya dieksekusi dipanggil true
dan satu dipanggil false
) sebagai perintah dan periksa apakah kode keluar dari perintah itu nol (berhasil).
$flag; if [ "$?" -eq 0 ]; then ... fi
Atau lebih pendek:
if "$flag"; then ... fi
Jika konten variabel digunakan sebagai perintah, a !
dapat digunakan untuk meniadakan status keluar dari perintah, jika ada spasi di antara keduanya ( ! cmd
), seperti pada:
if ! "$flag"; then ... fi
Skrip harus berubah menjadi:
flag=false
while ! "$flag"
do
read x
if [ "$x" == "true" ]
then
flag=true
fi
echo "${x} : ${flag}"
done
Bilangan bulat
Gunakan nilai numerik dan Ekspansi Aritmatika .
Dalam hal ini, kode keluar $((0))
is 1
dan kode exit $((1))
is 0
.
Dalam bash, ksh dan zsh aritmatika dapat dilakukan di dalam ((..))
(perhatikan bahwa permulaan $
hilang).
flag=0; if ((flag)); then ... fi
Versi portabel dari kode ini lebih berbelit-belit:
flag=0; if [ "$((flag))" -eq 0 ]; then ... fi # test for a number
flag=0; if [ "$((flag))" == 0 ]; then ... fi # test for the string "0"
Di bash / ksh / zsh Anda bisa melakukan:
flag=0
while ((!flag))
do
read x
[ "$x" == "true" ] && flag=1
echo "${x} : ${flag}"
done
kalau tidak
Anda dapat "Membalikkan variabel boolean" (asalkan berisi nilai numerik) sebagai:
((flag=!flag))
Itu akan mengubah nilai flag
menjadi 0
atau 1
.
Catatan : Silakan periksa kesalahan di https://www.shellcheck.net/ sebelum memposting kode Anda sebagai pertanyaan, berkali-kali itu sudah cukup untuk menemukan masalah.