Sintaks Shell sangat bergantung pada konteks. Artinya, hal yang khusus (seperti true
atau false
) berarti sangat tergantung pada di mana itu terjadi. Dalam contoh Anda, false
memiliki tiga arti yang sangat berbeda:perintah, nilai string, dan nama variabel (tidak ada) yang berisi nilai integer. Biarkan saya menelusuri contoh-contohnya:
-
false
sebagai perintah:false; echo $? # prints "1" if false; then echo "yep"; else echo "nope"; fi # prints "nope"
Ada perintah bernama "false" (umumnya /usr/bin/false, atau bash builtin yang melakukan hal yang sama) yang tidak benar-benar melakukan apa pun kecuali keluar dengan status gagal. Sebagai status keluar, nol menunjukkan keberhasilan (yang mirip dengan kebenaran) dan bukan nol menunjukkan kegagalan (yang mirip dengan salah). Ini kebalikan dari konvensi zero=false, nonzero=true yang lebih umum, tetapi untuk status keluar, ini lebih masuk akal.
-
false
sebagai nilai string yang tidak diinterpretasikan:if [[ false ]]; then echo "yep"; else echo "nope"; fi # prints "yep" if [[ true ]]; then echo "yep"; else echo "nope"; fi # prints "yep" if [[ wibble ]]; then echo "yep"; else echo "nope"; fi # prints "yep" if [[ "this is a string" ]]; then echo "yep"; else echo "nope"; fi # prints "yep" [[ false ]]; echo $? # prints "0" (=success) [ false ]; echo $? # prints "0" (=success) test false; echo $? # prints "0" (=success)
Dalam semua kasus ini, perintah
test
atau sinonimnya[
atau ekspresi bersyarat bash[[ ]]
tidak mendapatkan ekspresi, hanya satu string, jadi mereka melakukan tes yang sangat sederhana:apakah ini string dengan panjang bukan nol? "true", "false", "wibble", dll semuanya bukan nol, jadi perintah/ekspresinya seperti kebenaran, karenanya berhasil. Bandingkan dengan:[[ "" ]]; echo $? # prints "1" (=failure), because the string is zero-length [[ ]]; echo $? # prints "1" (=failure), because there isn't even a string [ ]; echo $? # same
Perhatikan bahwa
test
dan[
adalah perintah normal, dan "false" (dan "wibble" dll) hanyalah argumen untuk itu.[[ ]]
adalah sedikit sintaks bash yang dapat digunakan sebagai pengganti perintah. Argumen/kontennya diuraikan secara berbeda dari nama perintah itu sendiri. -
false
sebagai kemungkinan nama variabel yang mungkin berisi bilangan bulat:if [[ false -eq true ]]; then echo "equal"; else echo "nope"; fi # prints "equal"
Yang ini agak aneh, dan bergantung pada detail bagaimana
[[ ]]
bash tes untuk kesetaraan numerik. Perhatikan bahwa di[[ ]]
(dan[ ]
dantest
ekspresi),-eq
pengujian persamaan numerik, dan=
tes untuk persamaan string. Jadi misalnya,[[ 01 -eq 1 ]]
(karena 1 dan 01 secara numerik sama) benar, tetapi[[ 01 = 1 ]]
salah (karena bukan string yang sama). Dalam kasus[[ false -eq true ]]
, "true" dan "false" bukan nilai integer, jadi bash mencoba mengonversinya menjadi integer dengan memperlakukannya sebagai nama variabel (dan berharap variabel berisi nilai integer). Faktanya, tidak ada yang didefinisikan sebagai variabel, jadi keduanya mengevaluasi ke string kosong, yang dapat diinterpretasikan sebagai bilangan bulat 0. Amati:if [[ false -eq true ]]; then echo "equal"; else echo "nope"; fi # prints "equal" if [[ false -eq 0 ]]; then echo "equal"; else echo "nope"; fi # prints "equal" false=5 if [[ false -eq true ]]; then echo "equal"; else echo "nope"; fi # now prints "nope"
Perhatikan bahwa mendefinisikan
false
sebagai variabel tidak berpengaruh pada penggunaan lainnya; ketika digunakan sebagai perintah itu masih akan keluar dengan status 1, dan ketika digunakan sebagai string itu masih "false" (bukan "5").