Saya mencoba mendeklarasikan variabel Boolean dalam skrip shell menggunakan sintaks berikut:
variable=$false
variable=$true
Apakah ini benar? Juga, jika saya ingin memperbarui variabel itu apakah saya akan menggunakan sintaks yang sama? Akhirnya, apakah sintaks berikut untuk menggunakan variabel Boolean sebagai ekspresi benar?
if [ $variable ]
if [ !$variable ]
true
danfalse
dalam konteks yang paling potongan di bawah ini hanya string polos, tidak yangbash built-ins
!!! Silakan baca jawaban Mike Holt di bawah ini. (Ini adalah salah satu contoh di mana jawaban yang sangat dipilih dan diterima adalah IMHO membingungkan dan membayangi konten wawasan dalam jawaban yang lebih rendah)true
. Ternyata jawaban asli Miku benar-benar memanggiltrue
built-in, tetapi jawaban yang direvisi tidak. Hal ini menyebabkan komentar tersebut keliru tentang bagaimana kode Miku bekerja. Jawaban Miku sejak itu telah diedit untuk secara eksplisit menunjukkan kode asli dan revisi. Semoga ini menempatkan kebingungan untuk beristirahat sekali dan untuk semua.[ true ] && echo yes, true is true
dan (upppsss)[ false ] && echo yes, false is also true
. / bin / true dan / bin / false memberikan kode pengembalian $? untuk fungsi bukan untuk perbandingan.variable=something
daripada yang benar, jika tidak disetelvariable=
itu akan menjadi salah[[ $variable ]] && echo true || echo false
dan terbalik[[ ! $variable ]] && echo false || echo true
Jawaban:
Jawaban yang Direvisi (12 Feb 2014)
Jawaban Asli
Peringatan: https://stackoverflow.com/a/21210966/89391
Dari: Menggunakan variabel boolean di Bash
Alasan jawaban asli dimasukkan di sini adalah karena komentar sebelum revisi pada 12 Februari 2014 hanya berkaitan dengan jawaban asli, dan banyak komentar salah ketika dikaitkan dengan jawaban yang direvisi. Misalnya, komentar Dennis Williamson tentang bash builtin
true
pada 2 Juni 2010 hanya berlaku untuk jawaban asli, bukan yang direvisi.sumber
if
pernyataan mengeksekusi isi variabel yang merupakan Bash builtintrue
. Perintah apa pun dapat ditetapkan sebagai nilai variabel dan nilai keluarnya akan dievaluasi.&&
dan||
operator:# t1=true; t2=true; f1=false;
#if $t1 || $f1; then echo is_true ; else echo is_false; fi;
(mengembalikan "true", karena t1 = true) #if $t1 && $f1 || $t2; then echo is_true ; else echo is_false; fi
(mengembalikan "true", karena t2 = true) . Sekali lagi, ini HANYA berfungsi karena "true" / "false" adalah bash-builtin (menghasilkan true / false). Anda tidak dapat menggunakan "jika $ var ..." kecuali var adalah cmd (yaitu, benar atau salah)TL; DR
Masalah dengan jawaban ( asli ) Miku
Saya tidak merekomendasikan jawaban yang diterima 1 . Sintaksnya cukup, tetapi memiliki beberapa kekurangan.
Katakanlah kita memiliki kondisi berikut.
Dalam kasus-kasus 2 berikut , kondisi ini akan mengevaluasi ke true dan menjalankan perintah bersarang.
Biasanya Anda hanya ingin kondisi Anda dievaluasi menjadi true ketika variabel "Boolean" Anda,
var
dalam contoh ini, secara eksplisit disetel ke true. Semua kasus lainnya sangat menyesatkan!Kasus terakhir (# 5) sangat nakal karena akan mengeksekusi perintah yang terkandung dalam variabel (itulah sebabnya kondisi mengevaluasi true untuk perintah yang valid 3, 4 ).
Ini adalah contoh yang tidak berbahaya:
Mengutip variabel Anda lebih aman, misalnya
if "$var"; then
. Dalam kasus di atas, Anda harus mendapatkan peringatan bahwa perintah tidak ditemukan. Tapi kami masih bisa berbuat lebih baik (lihat rekomendasi saya di bagian bawah)Lihat juga penjelasan Mike Holt tentang jawaban asli Miku.
Masalah dengan jawaban Hbar
Pendekatan ini juga memiliki perilaku yang tidak terduga.
Anda akan mengharapkan kondisi di atas untuk mengevaluasi ke false, sehingga tidak pernah menjalankan pernyataan bersarang. Mengherankan!
Mengutip nilai (
"false"
), mengutip variabel ("$var"
), atau menggunakantest
atau[[
bukannya[
, tidak membuat perbedaan.Apa yang saya lakukan merekomendasikan:
Berikut adalah cara yang saya sarankan Anda memeriksa "Boolean" Anda. Mereka bekerja seperti yang diharapkan.
Semuanya setara. Anda harus mengetik beberapa kali penekanan tombol daripada pendekatan di jawaban 5 lainnya , tetapi kode Anda akan lebih defensif.
Catatan kaki
man woman
masih akan dianggap sebagai perintah yang valid, bahkan jika tidak ada halaman manual tersebut.sumber
==
dengan[
atautest
tidak portabel. Mengingat portabilitas adalah satu-satunya keuntungan[
/test
memiliki lebih[[
, tongkat dengan=
.Tampaknya ada beberapa kesalahpahaman di sini tentang Bash builtin
true
, dan lebih khusus lagi, tentang bagaimana Bash memperluas dan menafsirkan ekspresi di dalam tanda kurung.Kode dalam jawaban miku sama sekali tidak ada hubungannya dengan Bash builtin
true
, atau/bin/true
, atau rasatrue
perintah lainnya. Dalam hal ini,true
tidak lebih dari string karakter sederhana, dan tidak ada panggilan ketrue
perintah / builtin yang pernah dibuat, baik oleh penugasan variabel, maupun dengan evaluasi ekspresi kondisional.Kode berikut secara fungsional identik dengan kode dalam jawaban miku:
Satu- satunya perbedaan di sini adalah bahwa empat karakter yang dibandingkan adalah 'y', 'e', 'a', dan 'h' bukannya 't', 'r', 'u', dan 'e'. Itu dia. Tidak ada upaya yang dilakukan untuk memanggil perintah atau builtin bernama
yeah
, juga tidak ada (dalam contoh miku) segala jenis penanganan khusus terjadi ketika Bash mem-parsing tokentrue
. Itu hanya string, dan sepenuhnya arbitrer.Pembaruan (2014-02-19): Setelah mengikuti tautan dalam jawaban miku, sekarang saya melihat dari mana beberapa kebingungan itu berasal. Jawaban Miku menggunakan tanda kurung tunggal, tetapi cuplikan kode yang ditautkannya tidak menggunakan tanda kurung. Hanya saja:
Kedua potongan kode akan berperilaku dengan cara yang sama, tetapi tanda kurung sepenuhnya mengubah apa yang terjadi di bawah tenda.
Inilah yang dilakukan Bash dalam setiap kasus:
Tidak ada tanda kurung:
$the_world_is_flat
ke string"true"
."true"
sebagai perintah.true
perintah (baik builtin atau/bin/true
, tergantung pada versi Bash).true
perintah (yang selalu 0) dengan 0. Ingat bahwa di sebagian besar shell, kode keluar 0 menunjukkan keberhasilan dan yang lainnya menunjukkan kegagalan.if
pernyataan ituthen
Kurung:
$the_world_is_flat
ke string"true"
.string1 = string2
. The=
operator adalah bash perbandingan string operator. Begitu..."true"
dan"true"
.if
pernyataan ituthen
.Kode tanpa kurung berfungsi, karena
true
perintah mengembalikan kode keluar 0, yang menunjukkan keberhasilan. Kode kurung berfungsi, karena nilai$the_world_is_flat
identik dengan string literaltrue
di sisi kanan=
.Hanya untuk mengarahkan titik awal, pertimbangkan dua cuplikan kode berikut:
Kode ini (jika dijalankan dengan hak akses root) akan me-reboot komputer Anda:
Kode ini hanya mencetak "Usaha yang bagus." Perintah reboot tidak dipanggil.
Pembaruan (2014-04-14) Untuk menjawab pertanyaan dalam komentar mengenai perbedaan antara
=
dan==
: AFAIK, tidak ada perbedaan. The==
operator adalah sinonim Bash-spesifik untuk=
, dan sejauh yang saya telah melihat, mereka bekerja persis sama dalam semua konteks.Catatan, bagaimanapun, bahwa aku secara khusus berbicara tentang
=
dan==
operator perbandingan string digunakan baik[ ]
atau[[ ]]
tes. Saya tidak menyarankan itu=
dan==
dapat dipertukarkan di mana-mana di bash.Misalnya, Anda jelas tidak dapat melakukan penugasan variabel
==
, sepertivar=="foo"
(baik secara teknis Anda dapat melakukan ini, tetapi nilainyavar
akan"=foo"
, karena Bash tidak melihat==
operator di sini, itu melihat=
operator (penugasan), diikuti oleh nilai literal="foo"
, yang baru saja menjadi"=foo"
).Juga, meskipun
=
dan==
dapat dipertukarkan, Anda harus ingat bahwa cara kerja tes-tes itu bergantung pada apakah Anda menggunakannya di dalam[ ]
atau[[ ]]
, dan juga pada apakah operan dikutip atau tidak. Anda dapat membaca lebih lanjut tentang itu di Panduan Skrip Bash Lanjutan: 7.3 Operator Perbandingan Lainnya (gulir ke bawah ke diskusi tentang=
dan==
).sumber
$the_world_is_flat && echo "you are in flatland!"
true
dibuat mengenai jawaban asli. (Jawaban yang direvisi pada 12 Februari 2014 tidak diajukan oleh miku.) Saya telah mengedit jawaban untuk menyertakan yang asli dan yang telah direvisi. Kemudian komentar orang masuk akal.true
. Apakah ada cara? Saya menduga banyak programmer yang terbiasa dengan bahasa yang lebih ketat untuk melihat jawaban ini untuk membantu mereka mencampurkan beberapabash
lem untuk membuat hidup mereka sedikit lebih mudah akan membutuhkan===
operator sehingga string dan "boolean" sebenarnya tidak dapat dipertukarkan. Haruskah mereka hanya menempel 0 dan 1 dan penggunaan(( $maybeIAmTrue ))
seperti yang disarankan di Quolonel Pertanyaan 's jawabannya ?true
, tetapi umumnya bukan sebagai sesuatu untuk membandingkan variabel dengan, karena yang sebenarnyatrue
tidak memiliki nilai per se. Yang dilakukannya hanyalah mengatur status keluar0
, yang menunjukkan keberhasilan. Perlu dicatat bahwa itu pada dasarnya setara dengan apa yang disebut "perintah nol", atau:
. Sejauh menggunakan0
dan1
, itulah yang saya lakukan di semua skrip saya hari ini di mana saya membutuhkan boolean. Dan saya menggunakan(( ))
operator alih-alih[[ ]]
mengevaluasi. Jadi, misalnya, jika saya punyaflag=0
, saya bisa melakukannyaif (( flag )); then ...
Gunakan ekspresi aritmatika.
Keluaran:
sumber
!
, atau akan melakukan ekspansi sejarah.((! foo))
bekerja, begitu juga! ((foo))
. Saya suka solusi ini, BTW. Akhirnya cara ringkas untuk melakukan variabel boolean.((foo || bar))
bekerja seperti yang diharapkan.(())
memperluas variabel secara rekursif, yang tidak saya harapkan.foo=bar; bar=baz; ((foo)) && echo echo
tidak mencetak apa pun, tetapi itu benar adanyabaz=1
. Jadi, Anda dapat mendukungfoo=true
danfoo=false
juga 0 atau 1 dengan melakukantrue=1
.Singkat cerita:
Tidak ada Boolean di Bash
Bash memang memiliki ekspresi Boolean dalam hal perbandingan dan ketentuan. Yang mengatakan, apa yang dapat Anda nyatakan dan bandingkan di Bash adalah string dan angka. Itu dia.
Di mana pun Anda melihat
true
ataufalse
di Bash, itu adalah string atau perintah / builtin yang hanya digunakan untuk kode keluarnya.Sintaks ini ...
pada dasarnya ...
Kondisi ini benar setiap kali perintah mengembalikan kode keluar 0.
true
danfalse
Bash bawaan dan kadang-kadang juga program mandiri yang tidak melakukan apa pun kecuali mengembalikan kode keluar yang sesuai.Persyaratan di atas setara dengan:
Saat menggunakan tanda kurung siku atau
test
perintah, Anda mengandalkan kode keluar dari konstruk itu. Perlu diingat bahwa[ ]
dan[[ ]]
juga hanya perintah / builtin seperti yang lain. Jadi ...sesuai dengan
dan
COMMAND
ini dia[[ 1 == 1 ]]
The
if..then..fi
membangun hanya sintaksis gula. Anda selalu dapat menjalankan perintah yang dipisahkan oleh amper ganda dan untuk efek yang sama:Saat menggunakan
true
danfalse
dalam konstruksi pengujian ini, Anda sebenarnya hanya meneruskan string"true"
atau"false"
ke perintah pengujian. Berikut ini sebuah contoh:Percaya atau tidak tetapi semua kondisi tersebut menghasilkan hasil yang sama :
TL; DR; selalu membandingkan dengan string atau angka
Untuk memperjelas hal ini kepada pembaca di masa mendatang, saya akan merekomendasikan selalu menggunakan tanda kutip sekitar
true
danfalse
:MELAKUKAN
JANGAN
Mungkin
sumber
T
danF
menjelaskan bahwa itu bukan nilai boolean nyata.[
(yaitutest
) dan[[
dan menggunakan yang cocok untuk kebutuhannya.if ....; then mytest='-gt'; else mytest='-eq'; fi; #several lines of code; if [ "$var1" "$mytest" "$var2" ]; then ...; fi
Dahulu, ketika semua yang kita miliki adalah
sh
, Boolean di mana ditangani dengan mengandalkan konvensitest
program di manatest
mengembalikan status keluar palsu jika dijalankan tanpa argumen.Ini memungkinkan seseorang untuk memikirkan variabel yang tidak disetel sebagai false dan variabel disetel ke nilai apa pun sebagai benar. Hari ini,
test
adalah bawaan untuk Bash dan umumnya dikenal dengan alias satu-karakternya[
(atau yang dapat dieksekusi untuk digunakan di shell yang tidak memilikinya, seperti yang dicatat dolmen):Karena mengutip konvensi, penulis skrip lebih suka menggunakan perintah majemuk
[[
yang menirutest
, tetapi memiliki sintaksis yang lebih bagus: variabel dengan spasi tidak perlu dikutip; seseorang dapat menggunakan&&
dan||
sebagai operator logis dengan prioritas yang aneh, dan tidak ada batasan POSIX pada jumlah istilah.Misalnya, untuk menentukan apakah FLAG diatur dan COUNT angka lebih besar dari 1:
Hal-hal ini bisa membingungkan ketika spasi, string nol panjang, dan variabel nol semua diperlukan dan juga ketika skrip Anda perlu bekerja dengan beberapa shell.
sumber
[
bukan hanya alias di dalambash
. Alias ini juga ada sebagai file biner (atau sebagai tautan yang menunjuk ke) dan dapat digunakan dengan telanjangsh
. Periksals -l /usr/bin/\[
. Denganbash
/zsh
Anda sebaiknya menggunakan[[
internal murni murni dan jauh lebih kuat.[
dantest
juga Bash SHELL BUILTIN COMMAND menurut halaman manual Bash, jadi seharusnya tidak ada masalah dalam kinerja. Hal yang sama dengan misalnya Dash. (/ bin / sh mungkin hanya symlink ke / bin / dash). Untuk menggunakan executable Anda harus menggunakan path lengkap yaitu/usr/bin/\[
.Tidak seperti banyak bahasa pemrograman lain, Bash tidak memisahkan variabel-variabelnya dengan "ketik". [1]
Jadi jawabannya cukup jelas. Tidak ada variabel Boolean di Bash.
Namun:
Menggunakan pernyataan pernyataan, kita bisa membatasi penugasan nilai untuk variabel. [2]
The
r
pilihan dideclare
danreadonly
digunakan untuk negara secara eksplisit bahwa variabel yang dibaca . Saya harap tujuannya jelas.sumber
declare -ir false=0 true=1
? Apa keuntungan menggunakan array?r
opsi &readonly
perintah. Saya akan melakukannya dengan cara yang Anda sarankan dalam skrip sayadeclare and use boolean variables
. Kita bisa, dalam lebih dari satu cara, meniru / berasumsi bahwa suatu variabel memiliki tipe . Saya tidak melihat yang disebutkan di mana pun dalam jawaban Anda.Alih-alih memalsukan Boolean dan meninggalkan jebakan untuk pembaca masa depan, mengapa tidak menggunakan nilai yang lebih baik daripada benar dan salah?
Sebagai contoh:
sumber
0
memaksa untukfalse
dan1
untuktrue
. Sehubungan dengan kode keluar program (yang digunakan bash secara historis) itu0
untuk hasil positif atautrue
dan semua yang lain adalah negatif / kesalahan ataufalse
.POSIX (Antarmuka Sistem Operasi Portabel)
Saya rindu di sini titik kunci, yaitu portabilitas. Itu sebabnya tajuk saya memiliki POSIX sendiri.
Pada dasarnya, semua jawaban yang dipilih sudah benar, dengan pengecualian mereka terlalu banyak Bash- spesifik.
Pada dasarnya, saya hanya ingin menambahkan lebih banyak informasi tentang portabilitas.
[
dan]
tanda kurung seperti dalam[ "$var" = true ]
tidak diperlukan, dan Anda dapat menghilangkannya dan menggunakantest
perintah secara langsung:Catatan penting: Saya tidak lagi merekomendasikan ini karena sudah mulai ditinggalkan dan lebih sulit untuk menggabungkan beberapa pernyataan.
Bayangkan apa kata-kata itu
true
danfalse
artinya bagi cangkang itu, ujilah sendiri:Tetapi menggunakan kutipan:
Hal yang sama berlaku untuk:
Shell tidak dapat mengartikannya selain string. Saya harap Anda mendapatkan ide seberapa baik menggunakan kata kunci yang tepat tanpa tanda kutip .
Tapi tidak ada yang mengatakannya di jawaban sebelumnya.
Apa artinya ini? Nah, beberapa hal.
Anda harus membiasakan diri dengan kata kunci Boolean yang sebenarnya diperlakukan seperti angka, yaitu
true
=0
danfalse
=1
, ingat semua nilai bukan nol diperlakukan sepertifalse
.Karena mereka diperlakukan sebagai angka, Anda harus memperlakukannya seperti itu juga, yaitu jika Anda mendefinisikan variabel katakan:
Anda dapat membuat nilai sebaliknya dengan:
Seperti yang Anda lihat sendiri, shell mencetak
true
string untuk pertama kali Anda menggunakannya, tetapi sejak itu, semuanya bekerja melalui angka yang0
mewakilitrue
atau1
mewakilifalse
.Akhirnya, apa yang harus Anda lakukan dengan semua informasi itu
Pertama, satu kebiasaan baik adalah menugaskan
0
alih-alihtrue
;1
bukannyafalse
.Kebiasaan baik kedua adalah menguji apakah variabelnya sama dengan nol:
sumber
Mengenai sintaks, ini adalah metodologi sederhana yang saya gunakan (dengan contoh) untuk secara konsisten dan waras mengelola logika Boolean:
Jika variabel tidak pernah dideklarasikan, jawabannya adalah:
# false
Jadi, cara sederhana untuk mengatur variabel ke true (menggunakan metodologi sintaks ini) adalah
var=1
,; sebaliknyavar=''
,.Referensi:
-n
= Benar jika panjang string var bukan nol.-z
= Benar jika panjang string var adalah nol.sumber
Dalam banyak bahasa pemrograman, tipe Boolean adalah, atau diimplementasikan sebagai, subtipe integer, di mana
true
berperilaku seperti1
danfalse
berperilaku seperti0
:Boolean dalam C
Boolean dengan Python
Boolean di Jawa
Secara matematis , aljabar Boolean menyerupai bilangan bulat modul hitung 2. Karena itu, jika bahasa tidak menyediakan tipe Boolean asli, solusi yang paling alami dan efisien adalah dengan menggunakan bilangan bulat. Ini berfungsi dengan hampir semua bahasa. Misalnya, di Bash Anda dapat melakukan:
man bash :
sumber
Bill Parker ditolak , karena definisinya dibalik dari konvensi kode normal. Biasanya, true didefinisikan sebagai 0 dan false didefinisikan sebagai bukan nol. 1 akan bekerja untuk false, seperti juga 9999 dan -1. Sama dengan nilai-nilai fungsi kembali - 0 adalah sukses dan apa pun bukan nol kegagalan. Maaf, saya belum memiliki kredibilitas jalan untuk memilih atau membalasnya secara langsung.
Bash merekomendasikan penggunaan kurung ganda sekarang sebagai kebiasaan, bukan kurung tunggal, dan tautan yang diberikan Mike Holt menjelaskan perbedaan cara kerjanya. 7.3. Operator Perbandingan Lainnya
Untuk satu hal,
-eq
adalah operator numerik, sehingga memiliki kodenyaakan mengeluarkan pernyataan kesalahan, mengharapkan ekspresi integer. Ini berlaku untuk salah satu parameter, karena tidak ada nilai integer. Namun, jika kita menempatkan tanda kurung ganda di sekitarnya, itu tidak akan mengeluarkan pernyataan kesalahan, tetapi akan menghasilkan nilai yang salah (baik, dalam 50% dari permutasi yang mungkin). Ini akan mengevaluasi ke [[0 -eq true]] = sukses, tetapi juga ke [[0 -eq false]] = sukses, yang salah (hmmm .... bagaimana dengan buildin yang menjadi nilai numerik?).
Ada permutasi lain dari kondisi yang akan memberikan output yang salah juga. Pada dasarnya, apa pun (selain kondisi kesalahan yang tercantum di atas) yang menetapkan variabel ke nilai numerik dan membandingkannya dengan true / false builtin, atau menetapkan variabel ke true / false builtin dan membandingkannya dengan nilai numerik. Juga, apa pun yang menetapkan variabel ke true / false builtin dan melakukan perbandingan menggunakan
-eq
. Jadi hindari-eq
untuk perbandingan Boolean dan hindari menggunakan nilai numerik untuk perbandingan Boolean. Berikut ringkasan permutasi yang akan memberikan hasil yang tidak valid:Jadi, sekarang untuk apa yang berhasil. Gunakan benar / salah bawaan untuk perbandingan Anda dan evaluasi Anda (seperti dicatat Mike Hunt, jangan menyertakannya dalam tanda kutip). Kemudian gunakan tanda sama dengan tunggal atau ganda atau ganda (= atau ==) dan kurung tunggal atau ganda ([] atau [[]]). Secara pribadi, saya suka tanda sama dengan ganda, karena mengingatkan saya pada perbandingan logis dalam bahasa pemrograman lain, dan tanda kutip ganda hanya karena saya suka mengetik. Jadi ini bekerja:
Itu dia.
sumber
true
/false
built-in yang tidak digunakan di sini (mengabaikan apa sintaks dari beberapa editor mungkin menyiratkan), terutama di[…]
kasus Anda dapat menganggapnya sebagai string sederhana di sini (yang diberikan sebagai parameter untuk[
perintah).Temuan dan saran saya sedikit berbeda dari pos lainnya. Saya menemukan bahwa saya dapat menggunakan "boolean" pada dasarnya seperti yang dilakukan orang dalam bahasa "biasa", tanpa "hoop jumping" yang disarankan ...
Tidak perlu
[]
atau perbandingan string eksplisit ... Saya mencoba beberapa distribusi Linux. Saya menguji Bash, Dash, dan BusyBox . Hasilnya selalu sama. Saya tidak yakin apa yang dibicarakan oleh posting terpilih teratas asli. Mungkin waktu telah berubah dan hanya itu yang ada di sana?Jika Anda menetapkan variabel ke
true
, itu kemudian mengevaluasi sebagai "setuju" dalam kondisi. Setel kefalse
, dan ini dievaluasi menjadi "negatif". Sangat mudah! Satu-satunya peringatan, adalah bahwa variabel yang tidak terdefinisi juga mengevaluasi seperti benar ! Akan lebih baik jika melakukan yang sebaliknya (seperti dalam kebanyakan bahasa), tetapi itulah triknya - Anda hanya perlu secara eksplisit menginisialisasi boolean Anda menjadi benar atau salah .Mengapa bisa seperti ini? Jawaban itu dua kali lipat. A) benar / salah dalam shell benar-benar berarti "tidak ada kesalahan" vs "kesalahan" (yaitu 0 vs yang lain). B) benar / salah bukan nilai - melainkan pernyataan dalam skrip shell! Mengenai poin kedua, mengeksekusi
true
ataufalse
on line dengan sendirinya menetapkan nilai kembali untuk blok Anda ke nilai itu, yaitufalse
deklarasi "kesalahan yang ditemui", di mana benar "membersihkan" itu. Menggunakannya dengan penugasan ke variabel "mengembalikan" itu ke dalam variabel. Sebuah terdefinisi variabel mengevaluasi sepertitrue
dalam bersyarat karena sama-sama mewakili 0 atau "tidak kesalahan yang ditemui".Lihat contoh garis Bash dan hasil di bawah ini. Uji sendiri jika Anda ingin mengonfirmasi ...
Hasil
sumber
Ini adalah contoh sederhana yang cocok untuk saya:
sumber
Berikut ini adalah implementasi dari tangan pendek
if true
.Contoh 1
Contoh 2
sumber
Saya menemukan jawaban yang ada membingungkan.
Secara pribadi, saya hanya ingin memiliki sesuatu yang terlihat dan berfungsi seperti C.
Cuplikan ini berfungsi beberapa kali sehari dalam produksi:
dan untuk membuat semua orang senang, saya menguji:
Yang juga berfungsi dengan baik.
The
$snapshotEvents
mengevaluasi isi dari nilai variabel. Jadi kamu butuh$
.Anda tidak benar-benar membutuhkan tanda kurung, saya hanya menemukan itu membantu.
Diuji pada: GNU Bash, versi 4.1.11 (2) -release
Bash Guide for Beginners , Machtelt Garrels, v1.11, 2008
sumber
()
-s tidak diperlukan. Satu-satunya tanggapan saya, adalah mencobanya, tampaknya tergantung pada versi Bash, ekspresi atau konteks aktual dan semacamnya.Berikut ini adalah peningkatan pada jawaban asli miku yang membahas kekhawatiran Dennis Williamson tentang kasus di mana variabel tidak disetel:
Dan untuk menguji apakah variabelnya adalah
false
:Tentang kasus lain dengan konten jahat dalam variabel, ini merupakan masalah dengan input eksternal apa pun yang dimasukkan ke program.
Setiap input eksternal harus divalidasi sebelum memercayainya. Tetapi validasi itu harus dilakukan sekali saja, ketika input itu diterima.
Tidak harus memengaruhi kinerja program dengan melakukannya pada setiap penggunaan variabel seperti yang disarankan Dennis Williamson .
sumber
Anda dapat menggunakan shFlags .
Ini memberi Anda opsi untuk mendefinisikan:
DEFINE_bool
Contoh:
Dari baris perintah Anda dapat mendefinisikan:
sumber
Ini adalah tes kecepatan tentang berbagai cara untuk menguji nilai "Boolean" di Bash:
Itu akan mencetak sesuatu seperti
sumber
Alternatif - gunakan fungsi
Mendefinisikan fungsi kurang intuitif, tetapi memeriksa nilai kembalinya sangat mudah.
sumber
Bash benar-benar membingungkan masalah dengan orang-orang seperti
[
,[[
,((
,$((
, dllSemua menginjak ruang kode masing-masing. Saya kira ini sebagian besar bersejarah, di mana Bash harus berpura-pura menjadi
sh
sesekali.Sebagian besar waktu, saya hanya bisa memilih metode dan tetap menggunakannya. Dalam hal ini, saya cenderung mendeklarasikan (lebih disukai dalam file perpustakaan umum yang dapat saya sertakan dengan
.
skrip aktual saya).Saya kemudian dapat menggunakan
((
...))
operator aritmatika untuk menguji demikian.Anda harus disiplin. Anda
testvar
harus diatur ke$TRUE
atau$FALSE
setiap saat.Di
((
...))
pembanding, Anda tidak perlu yang sebelumnya$
, yang membuatnya lebih mudah dibaca.Saya dapat menggunakan
((
...))
karena$TRUE=1
dan$FALSE=0
, yaitu nilai numerik.Kelemahannya adalah harus menggunakan
$
sesekali:yang tidak begitu cantik.
Ini bukan solusi yang sempurna, tetapi mencakup setiap kasus yang saya butuhkan dari tes tersebut.
sumber