Differenza tra [[$ variabile]] e [[-n $ variabile]]?


8

In bash, sono [[ $variable ]]e [[ -n $variable ]]completamente equivalenti? Sembra essere il caso a giudicare dall'output di seguito, ma vedo entrambe le forme di utilizzo prevalenti negli script di 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. Interessante. Le uscite da [[ -n $(echo -ne "\0") ]]; echo $?e [ -n $(echo -ne "\0") ]; echo $?differiscono
dchirikov

@dchirikov, perché nella seconda hai dimenticato di citare la sostituzione del comando, quindi alla fine è stata [ -n ]la stessa [ -n -n ]. Nelle shell diverse da zsh, gli argomenti di comando (anche incorporati) o le variabili di shell non possono contenere caratteri NUL.
Stéphane Chazelas,

Risposte:


4

[ "$var" ]è equivalente a [ -n "$var" ]in bash e la maggior parte delle shell al giorno d'oggi. In altre shell più vecchie, sono pensate per essere equivalenti, ma soffrono di diversi bug per alcuni valori speciali di "$ var" come =, (o !.

Trovo [ -n "$var" ]più leggibile ed è il ciondolo di [ -z "$var" ].

[[ -n $var ]]è lo stesso [[ $var ]]di tutte le shell in cui è implementata quella sintassi ksh non standard.

test "x$var" != x sarebbe il più affidabile se si desidera essere portatili con shell molto vecchie.


1

Secondo Test per stringa di lunghezza diversa da zero in bash: [-n “$ var”] o [“$ var”] , sì, sono equivalenti.

Sono equivalenti anche citando il nome della variabile.

Importante notare : il nome della domanda che cito si riferisce solo [, ma la risposta considera sia [e [[.


1
Ma [[]]non è l'equivalente di []:)
dchirikov il

No, non lo sono. Ma nella risposta che cito sono prese in considerazione entrambe le forme.
Nozimica,

Il comportamento nel test "\ 0" come variabile è diverso. L'operatore [] fornisce 0 o 1. E [[]] indica 1 in entrambi i casi.
Dchirikov,

+1 per il link che è molto istruttivo, tuttavia la risposta di Stephane Chazelas, che ho accettato, è più pertinente.
Iruvar,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.