Pertanyaan saya adalah nilai pengembalian yang dihasilkan oleh kode ini:
if [ -n ]; then echo "true"; else echo "false"; fi
Ini mencetak true
.
Tes pelengkap menggunakan [ -z ]
cetak juga true
:
if [ -z ]; then echo "true"; else echo "false"; fi
Dalam kode di atas, mengapa [ -n ]
tes menganggap nilai string yang tidak lulus sama sekali, bukan nol?
Kode di bawah ini dicetak false
. Ini diharapkan karena nilai string yang diteruskan adalah nol dan panjang nol.
if [ -n "" ]; then echo "true"; else echo "false"; fi
[ -t ]
sedang menguji apakah stdout adalah terminal (kependekan[ -t 1 ]
) dan beberapa shell masih melakukannya (dalam kasusksh93
hanya ketika itu-t
literal), jadi lebih baik digunakan[ -n "$var" ]
daripada[ "$var" ]
. Meskipun itu masih akan gagal dalam beberapatest
implementasi lama untuk nilai-nilai$var
suka=
, dalam hal ini[ "" != "$var" ]
atau[ "x$var" != x ]
ataucase $x in "")...
mungkin lebih baik.-o
sini. Dalam beberapa shell sepertibash
,-o
keduanya merupakan operator unary (tes jika opsi diatur) dan biner (atau), sehingga hal-hal seperti[ ! -o monitor ]
bersifat ambigu. Apakah menguji bahwamonitor
pilihan tidak diatur, atau yang baik!
ataumonitor
string non-kosong? Aturan POSIX memutuskan: yang terakhir (berbeda dengan[[ ! -o monitor ]]
).[ -n ]
tidak menggunakan-n
tes.The
-n
dalam[ -n ]
bukan tes sama sekali. Ketika hanya ada satu argumen di antara[
dan]
, argumen itu adalah string yang diuji untuk melihat apakah argumen itu kosong. Bahkan ketika string itu memiliki pimpinan-
, itu masih ditafsirkan sebagai operan, bukan tes. Karena string-n
tidak kosong - itu berisi dua karakter,-
dann
, bukan nol karakter -[ -n ]
dievaluasi menjadi true.Seperti yang dikatakan Ignacio Vazquez-Abrams , di mana
string
ada satu argumen, tes yang dilakukanstring
dalam sama dengan tes yang dilakukan oleh . Ketika kebetulan , tidak ada yang istimewa terjadi. The dalam dan yang kedua di hanya string sedang diuji untuk kekosongan.[ string ]
[ -n string ]
string
-n
-n
[ -n ]
-n
[ -n -n ]
Ketika hanya ada satu argumen di antara
[
dan]
, argumen itu selalu merupakan string yang akan diuji untuk kekosongan, bahkan jika itu dinamai sama dengan tes. Demikian pula, ketika ada dua argumen di antara[
dan]
dan yang pertama adalah-n
, yang kedua selalu merupakan string yang akan diuji untuk nonemptiness, bahkan jika kebetulan diberi nama sama dengan tes. Ini hanya karena sintaks untuk[
menegaskan bahwa argumen tunggal antara[
dan]
atau sesudahnya-n
adalah operan string.Untuk alasan yang sama yang
[ -n ]
tidak menggunakan-n
tes,[ -z ]
tidak menggunakan-z
tes.Anda dapat mempelajari lebih lanjut tentang
[
dibash
dengan memeriksa bantuan untuk itu. Perhatikan bahwa shell adalah builtin :Dengan demikian Anda dapat lari
help [
untuk mendapatkan bantuan tentang hal itu:Untuk informasi lebih lanjut, termasuk tes apa yang didukung dan cara kerjanya, Anda harus melihat bantuannya
test
. Ketika Anda menjalankan perintahhelp test
, Anda akan mendapatkan daftar terperinci. Daripada mereproduksi semuanya, inilah bagian tentang operator string:Perhatikan itu
-n STRING
danSTRING
lakukan hal yang sama: mereka menguji apakah stringSTRING
tidak kosong.sumber
IFS
spasi putih, akan melakukan itu; variabel yang berisi banyak kata dan bukannya nol menghasilkan efek lain dan dapat menyebabkan tes yang sama sekali berbeda dijalankan. String yang muncul secara harfiah dengan maksud menjadi operan hanya akan berfungsi dengan baik jika tidak mengandung spasi atau tab atau jika dikutip. Jawabannya akan menjadi jauh lebih lama dan lebih rumit jika saya membahas topik ini dengan cara yang dapat diakses. Jika Anda memutuskan untuk mengirim jawaban, silakan @ saya di sini tentang hal itu![ "$var" ]
akan pernah dapat digunakan sebagai ujian karena$var
dapat diperluas ke-n
.[ -n ]
ini benar karena[
perintah (aliastest
perintah) bertindak berdasarkan jumlah argumen yang diberikan. Jika hanya diberikan argumen tunggal, hasilnya "benar" jika argumen tersebut adalah string yang tidak kosong. "-n" adalah string dengan 2 karakter, bukan kosong, oleh karena itu "true".sumber