Algunos shells históricos implementaron un analizador muy simple que podría confundirse con cosas como [ -n = "" ]
donde el primer operando se =
parece a un operador, y analizaría esto [ -n = ]
o causaría un error de sintaxis. En [ "x$1" = x"" ]
, el x
prefijo garantiza que x"$1"
no pueda parecer un operador, por lo que la única forma en que el shell puede analizar esta prueba es tratando =
como un operador binario.
Todos los shells modernos, e incluso los más antiguos aún en funcionamiento, siguen las reglas POSIX que exigen que todas las expresiones de prueba de hasta 4 palabras se analicen correctamente. Entonces, [ -z "$1" ]
es una forma adecuada de probar si $1
está vacía , y [ "$x" = "$y" ]
es una forma adecuada de probar la igualdad de dos variables.
Incluso algunos shells actuales pueden confundirse con expresiones más largas, y algunas expresiones son realmente ambiguas, por lo tanto, evite usar los operadores -a
y -o
para construir pruebas booleanas más largas y, en su lugar, use llamadas separadas [
y los operadores propios &&
y ||
booleanos del shell .
Gilles 'SO- deja de ser malvado'
fuente
sh
en algunos Unices comerciales todavía tienen el problema. Ver aquí para más detalles.[ -z "$1" ]
es una forma adecuada de probar si$1
está vacía .sh -c '[ -z "$1" ]' ''; sh -c '[ -z "$1" ]'
- ambos devuelven 0, pero en el segundo caso$1
no puede estar vacío porque no existe.Según http://www.mpi-inf.mpg.de/~uwe/lehre/unixffb/quoting-guide.html , la
-z
prueba no es segura en algunas implementaciones , presumiblemente cuando"-o a=a"
se prueban cadenas "interesantes" como .fuente
Las pruebas anteriores también causarán un error si ejecuta con "set -u" o "set -o nounset"
Una forma más estable de verificar una variable vacía sería usar la expansión de parámetros :
MYVAR = $ {MYVAR: - "Valor incorrecto"}
Este método funciona para el shell bourne tradicional, así como para ksh y bash.
fuente
fuente
=
versus-z
, ahora cómo.