it-swarm-es.tech

En Bash, ¿son [[-z "$ 1"] y if ["$ 1" = ""] lo mismo?

En las secuencias de comandos de Bash Shell, ¿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 usando -z logra lo mismo.

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

29
Johan

[ "$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 sea un componente de Word como ;.)

[ es un Shell integrado como cualquier otro; de hecho, también se puede deletrear test (la única diferencia entre los dos es que [ requiere un ] como último argumento). Entonces si corres [ "$1" = "" ] con $1 expandiéndose a -z, el operador de prueba ve tres argumentos: -z, = y la cadena vacía. Algunos shells más antiguos Bourne 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 no habrían apoyado [ -z "$1" ] ya sea. Un idioma común de Shell es [ x"$1" = x"" ]. Evita el riesgo de analizar operandos como operadores porque ningún operador comienza con una letra.

En ksh, bash y zsh, puede usar la sintaxis de doble paréntesis, [[ -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.