Perbedaan antara [[$ variabel]] dan [[-n $ variabel]]?


8

Dalam bash, apakah [[ $variable ]]dan [[ -n $variable ]]sepenuhnya sama? Tampaknya menjadi kasus dilihat dari output di bawah ini, tapi saya melihat kedua bentuk penggunaan lazim dalam skrip shell.

$ z="abra"
$ [[ $z ]]
$ echo $?
0
$ [[ -n $z ]]
$ echo $?
0
$ z=""
$ [[ $z ]]
$ echo $?
1
$ [[ -n $z ]]
$ echo $?
1
$ unset z
$ [[ $z ]]
$ echo $?
1
$ [[ -n $z ]]
$ echo $?
1

Hm Menarik. Keluaran dari [[ -n $(echo -ne "\0") ]]; echo $?dan [ -n $(echo -ne "\0") ]; echo $?berbeda
dchirikov

@dchirikov, itu karena di yang kedua, Anda lupa mengutip substitusi perintah, jadi akhirnya [ -n ]sama saja [ -n -n ]. Dalam shell selain zsh, argumen command (even builtin) atau variabel shell tidak dapat berisi karakter NUL.
Stéphane Chazelas

Jawaban:


4

[ "$var" ]setara dengan [ -n "$var" ]di bash dan sebagian besar shell saat ini. Di shell yang lebih lama, mereka seharusnya setara, tetapi menderita bug yang berbeda untuk beberapa nilai khusus seperti "$ var" =, (atau !.

Saya menemukan [ -n "$var" ]lebih terbaca dan liontin [ -z "$var" ].

[[ -n $var ]]sama dengan [[ $var ]]di semua shell di mana sintaks ksh non-standar diimplementasikan.

test "x$var" != x akan menjadi yang paling andal jika Anda ingin portable ke cangkang yang sangat tua.


1

Menurut Test untuk string panjang non-nol di bash: [-n "$ var"] atau ["$ var"] , ya, mereka setara.

Mereka setara bahkan mengutip nama variabel.

Penting untuk diperhatikan : nama pertanyaan yang saya kutip merujuk hanya untuk [, tetapi jawabannya mempertimbangkan keduanya [dan [[.


1
Tetapi [[]]tidak setara dengan []:)
dchirikov

Tidak, mereka tidak. Tetapi dalam jawaban yang saya kutip, kedua bentuk itu dipertimbangkan.
nozimica

Perilaku dalam menguji "\ 0" sebagai variabel berbeda. Operator [] memberikan 0 atau 1. Dan [[]] memberikan 1 dalam kedua kasus.
dchirikov

+1 untuk tautan yang sangat informatif namun jawaban Stephane Chazelas, yang saya terima, lebih tepatnya.
iruvar
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.