¿Diferencia entre [[$ variable]] y [[-n $ variable]]?

8

En bash, ¿son [[ $variable ]]y [[ -n $variable ]]completamente equivalentes? Parece ser el caso a juzgar por el resultado a continuación, pero veo que ambas formas de uso prevalecen en los scripts de 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
fuente
Hm. Interesante. Salidas de [[ -n $(echo -ne "\0") ]]; echo $?y [ -n $(echo -ne "\0") ]; echo $?difieren
dchirikov
@dchirikov, eso es porque en el segundo, olvidaste citar la sustitución del comando, por lo que terminó siendo [ -n ]lo mismo [ -n -n ]. En shells que no sean zsh, los argumentos de comando (incluso los incorporados) o las variables de shell no pueden contener caracteres NUL.
Stéphane Chazelas

Respuestas:

4

[ "$var" ]es equivalente a [ -n "$var" ]bash y la mayoría de las conchas en la actualidad. En otros shells más antiguos, están destinados a ser equivalentes, pero sufren de diferentes errores para algunos valores especiales de "$ var" como =, (o !.

Me parece [ -n "$var" ]más legible y es el colgante de [ -z "$var" ].

[[ -n $var ]]es lo mismo que [[ $var ]]en todos los shells donde se implementa esa sintaxis ksh no estándar.

test "x$var" != x sería el más confiable si desea ser portátil a conchas muy antiguas.

Stéphane Chazelas
fuente
1

De acuerdo con la prueba de cadena de longitud distinta de cero en bash: [-n “$ var”] o [“$ var”] , sí, son equivalentes.

Son equivalentes incluso citando el nombre de la variable.

Importante notar : el nombre de la pregunta que cito se refiere solo [, pero la respuesta considera ambos [y [[.

nozimica
fuente
1
Pero [[]]no es el equivalente de []:)
dchirikov
No, no lo son. Pero en la respuesta que cito, se consideran ambas formas.
nozimica
El comportamiento al probar "\ 0" como variable es diferente. El operador [] da 0 o 1. Y [[]] da 1 en ambos casos.
dchirikov
+1 para el enlace que es muy informativo, sin embargo, la respuesta de Stephane Chazelas, que acepté, es más acertada.
iruvar