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
iruvar
sumber
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.

Stéphane Chazelas
sumber
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 [[.

nozimica
sumber
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