bash – ¿Por qué la expansión de parámetros con espacios sin comillas funciona entre corchetes dobles "[[" pero no entre corchetes simples "["?

Pregunta:

Estoy confundido con el uso de corchetes simples o dobles. Mira este código:

dir="/home/mazimi/VirtualBox VMs"

if [[ -d ${dir} ]]; then
    echo "yep"
fi

Funciona perfectamente aunque la cuerda contenga un espacio. Pero cuando lo cambio a un solo corchete:

dir="/home/mazimi/VirtualBox VMs"

if [ -d ${dir} ]; then
    echo "yep"
fi

Dice:

./script.sh: line 5: [: /home/mazimi/VirtualBox: binary operator expected

Cuando lo cambio a:

dir="/home/mazimi/VirtualBox VMs"

if [ -d "${dir}" ]; then
    echo "yep"
fi

Funciona bien. ¿Alguien puede explicar lo que está pasando? ¿Cuándo debo asignar comillas dobles alrededor de variables como "${var}" para evitar problemas causados ​​por espacios?

Respuesta:

El único soporte [ es en realidad un alias para la test de comandos, no es la sintaxis.

Una de las desventajas (de muchas) del corchete simple es que si uno o más de los operandos que está tratando de evaluar devuelven una cadena vacía, se quejará de que esperaba dos operandos (binarios). Es por esto que ves que la gente hace [ x$foo = x$blah ] , la x garantiza que el operando nunca se evaluará como una cadena vacía.

El corchete doble [[ ]] , por otro lado, es sintaxis y es mucho más capaz que [ ] . Como averiguó, no tiene el problema de "operando faltante" y también permite una sintaxis más similar a C con >, <, >=, <=, !=, ==, &&, || operadores.

Mi recomendación es la siguiente: si su intérprete es #!/bin/bash , utilice siempre [[ ]]

Es importante tener en cuenta que [[ ]] no es compatible con todos los shells POSIX, sin embargo, muchos shells sí lo admiten, como zsh y ksh además de bash

Leave a Comment

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

web tasarım