[ -n ]tidak menggunakan -ntes.
The -ndalam [ -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 -ntidak kosong - itu berisi dua karakter, -dan n, bukan nol karakter - [ -n ]dievaluasi menjadi true.
Seperti yang dikatakan Ignacio Vazquez-Abrams , di mana stringada satu argumen, tes yang dilakukan stringdalam 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 -nadalah operan string.
Untuk alasan yang sama yang [ -n ]tidak menggunakan -ntes, [ -z ]tidak menggunakan -ztes.
Anda dapat mempelajari lebih lanjut tentang [di bashdengan memeriksa bantuan untuk itu. Perhatikan bahwa shell adalah builtin :
$ type [
[ is a shell builtin
Dengan demikian Anda dapat lari help [untuk mendapatkan bantuan tentang hal itu:
$ help [
[: [ arg... ]
Evaluate conditional expression.
This is a synonym for the "test" builtin, but the last argument must
be a literal `]', to match the opening `['.
Untuk informasi lebih lanjut, termasuk tes apa yang didukung dan cara kerjanya, Anda harus melihat bantuannya test. Ketika Anda menjalankan perintah help test, Anda akan mendapatkan daftar terperinci. Daripada mereproduksi semuanya, inilah bagian tentang operator string:
-z STRING True if string is empty.
-n STRING
STRING True if string is not empty.
STRING1 = STRING2
True if the strings are equal.
STRING1 != STRING2
True if the strings are not equal.
STRING1 < STRING2
True if STRING1 sorts before STRING2 lexicographically.
STRING1 > STRING2
True if STRING1 sorts after STRING2 lexicographically.
Perhatikan itu -n STRINGdan STRINGlakukan hal yang sama: mereka menguji apakah string STRINGtidak kosong.
[ -t ]sedang menguji apakah stdout adalah terminal (kependekan[ -t 1 ]) dan beberapa shell masih melakukannya (dalam kasusksh93hanya ketika itu-tliteral), jadi lebih baik digunakan[ -n "$var" ]daripada[ "$var" ]. Meskipun itu masih akan gagal dalam beberapatestimplementasi lama untuk nilai-nilai$varsuka=, dalam hal ini[ "" != "$var" ]atau[ "x$var" != x ]ataucase $x in "")...mungkin lebih baik.