p.ej
if [ "$FOO" = "true" ]; then
vs
if [ $FOO = "true" ]; then
Cual es la diferencia? Parece que las dos declaraciones también funcionan.
bash
shell
shell-script
quoting
Ryan
fuente
fuente
a='foo bar'; [[ $a == "foo bar" ]]
. Sin embargo, una variable que no contiene caracteres glob no tiene que ser:[[ $a == $a ]]
. La expansión de palabras no se realiza entre corchetes dobles. Y para la coincidencia de expresiones regulares, el patrón en el lado derecho no se debe citar o se tomará como una cadena literal:[[ $a =~ .*oo.*r ]]
(sin embargo, el patrón debe estar en una variable sin comillas ...[[ $a == foo* ]]
. ¿Puede proporcionar ejemplos adicionales de un requisito para citar además de mi ejemplo de cadena literal?Respuestas:
Si el valor de
$FOO
es una sola palabra que no contiene un carácter comodín\[*?
, entonces las dos son idénticas.Si
$FOO
no está asignado, está vacío o tiene más de una palabra (es decir, contiene espacios en blanco o$IFS
), entonces la versión sin comillas es un error de sintaxis. Si resulta ser la secuencia correcta de palabras (como0 -eq 0 -o false
), el resultado podría ser arbitrario. Por lo tanto, es una buena práctica citar siempre variables en scripts de shell.Por cierto,
"true"
no necesita ser citado.fuente
Para ilustrar qué problemas puede causar, aquí hay algunos ejemplos.
Digamos que tenemos dos variables de la siguiente manera:
Ahora tenemos dos variables que contienen exactamente la misma cadena / valor. Si hicimos algunas declaraciones if para probar el resultado, en su caso:
En este punto lo conseguirás
bash: [: too many arguments
. El $ FOO sin comillas tiene ahora tres valores, a saber'[ , some , value'
.[
La palabra clave test no sabe qué ejecutar porque espera que el primer o segundo argumento sea un operador.Cuando citamos "$ FOO", le pedimos explícitamente
if
que mire los valores correctos donde no tiene lugar la división de palabras.Otro ejemplo:
rm $my_file
significa eliminar 'A' 'random' 'file.txt' que lo convierte en tres archivos.rm "$my_file"
eliminará "Un archivo aleatorio.txt" que crea un archivo.Espero no haberte confundido con estos ejemplos.
fuente
En este caso específico no hay diferencia.
Sin embargo, si
$FOO
contiene un espacio o algunos caracteres especiales, tendrá un problema.En el
"$FOO"
caso, usará la variable en total para hacer que la coincidencia lo aísle del problema del espacio.Sin embargo, si usa
$FOO
y hay un caso especial, afectará la declaración if.fuente