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

Pregunta:

En el script de shell Bash, ¿cuál es la diferencia (si existe) 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 el uso de -z logra lo mismo.

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

Respuesta:

[ "$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 no constitutivo de palabra como ; )

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

En ksh, bash y zsh, puede usar la sintaxis de corchetes dobles, [[ -z $1 ]] . Esta sintaxis más nueva (es de finales de la década de 1980 en lugar de mediados de la de 1970) elimina el riesgo de que los operandos se analicen 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 entre corchetes dobles, y no es necesario que entre comillas dobles las expansiones de variables.

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top

web tasarım