En Bash, ¿son [[-z “$ 1”] y si [“$ 1” = “”] lo mismo?

28

En las secuencias de comandos de shell Bash, ¿cuál es la diferencia (si hay alguna) entre las siguientes dos declaraciones?

    1.) if [ -z "$1" ]
    2.) if [ "$1" = "" ]

Me encontré escribiendo el segundo en algunos scripts, pero luego leí aquí que usarlo -zlogra lo mismo.

Si hay problemas al usar el segundo, ¿deberíamos ignorar que el primero se ve un poco mejor?

Johan
fuente
3
Para una comparación detallada, vea mi respuesta en Stack Overflow. Además, mira esto y esto .
Pausado hasta nuevo aviso.
buenos enlaces, con algunas buenas respuestas :)
Johan

Respuestas:

36

[ "$1" = "" ]y [ -z "$1" ]son exactamente equivalentes en bash y otros shells compatibles con POSIX. (Tenga en cuenta que debe haber un espacio a cada lado de los corchetes, a menos que haya un carácter que no constituya palabras como ;).

[es un shell incorporado como cualquier otro; de hecho también se puede deletrear test(la única diferencia entre los dos es que [requiere un ]como último argumento). Así que si se ejecuta [ "$1" = "" ]con $1la ampliación a -z, el operador ve la prueba tres argumentos: -z, =y la cadena vacía. Algunas conchas de Bourne antiguas a veces arrojaban errores de análisis cuando un operando se parecía a un operador de esta manera, incluso si no había ambigüedad en la expresión completa. No sé si alguna versión tuvo problemas con esta expresión en particular, pero las expresiones más complejas podrían descartarlas. También puede haber versiones que tuvieron problemas con palabras vacías; estos tampoco habrían sido compatibles [ -z "$1" ]. Un idioma común de shell es[ x"$1" = x"" ]. Evita el riesgo de analizar los operandos como operadores porque ningún operador comienza con una letra.

En ksh, bash y zsh, puede utilizar la sintaxis soporte doble, [[ -z $1 ]]. Esta sintaxis más nueva (es de fines de la década de 1980 en lugar de mediados de la década de 1970) elimina el riesgo de que los operandos sean analizados como operadores mediante el uso de una construcción sintáctica especial en lugar de una incorporada ordinaria. Los operadores deben aparecer literalmente, sin comillas dentro de los corchetes dobles, y no necesita comillas dobles de expansiones variables.

Gilles 'SO- deja de ser malvado'
fuente
Se corrigió el error tipográfico con el espacio faltante al lado del soporte.
Johan