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 -z
logra lo mismo.
Si hay problemas al usar el segundo, ¿deberíamos ignorar que el primero se ve un poco mejor?
bash
shell-script
Johan
fuente
fuente
Respuestas:
[ "$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 deletreartest
(la única diferencia entre los dos es que[
requiere un]
como último argumento). Así que si se ejecuta[ "$1" = "" ]
con$1
la 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.fuente