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