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 xprefijo 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 $1está 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 -ay -opara 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
                    
                 
                
                 
shen algunos Unices comerciales todavía tienen el problema. Ver aquí para más detalles.[ -z "$1" ]es una forma adecuada de probar si$1está vacía .sh -c '[ -z "$1" ]' ''; sh -c '[ -z "$1" ]'- ambos devuelven 0, pero en el segundo caso$1no puede estar vacío porque no existe.Según http://www.mpi-inf.mpg.de/~uwe/lehre/unixffb/quoting-guide.html , la
-zprueba 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.