miércoles, 15 de julio de 2015

Comillas dobles

El primer tipo de entrecomillado que vamos a ver son las comillas dobles. Si colocas un texto dentro de comillas dobles, todos los caracteres especiales utilizados por el shell perderán su significado especial y serán tratados como caracteres ordinarios. Las excepciones son “$”, “\” (barra invertida), y “`” (tilde invertida). Esto significa que la  separación de palabras, expansión de nombres de archivo, expansión de la tilde de la ñ y la expansión con llaves están suprimidas, pero la expansión con parámetros, la expansión aritmética y la sustitución de comandos sí que funcionarán. Usando comillas dobles, podemos manejar nombres de archivo que contengan espacios en blanco. Digamos que somos la desafortunada víctima de un archivo llamado two words.txt. Si tratáramos de usarlo en la línea de comandos, la separación de palabras haría que fuera tratado como dos argumentos separados en lugar del único argumento que queremos:

[me@linuxbox ~]$ ls -l two words.txt
ls: cannot access two: No such file or directory
ls: cannot access words.txt: No such file or directory

Usando comillas dobles, paramos la separación de palabras y obtenemos el resultado deseado; más aún, incluso podemos reparar el daño causado:

[me@linuxbox ~]$ ls -l "two words.txt"
-rw-rw-r-- 1 me me 18 2008-02-20 13:03 two words.txt
[me@linuxbox ~]$ mv "two words.txt" two_words.txt

¡Ahí lo tienes! Ahora no tenemos que seguir escribiendo esas malditas comillas dobles.

Recuerda, la expansión con parámetros, la expansión aritmética y la sustitución de comandos siguen funcionando dentro de las comillas dobles:

[me@linuxbox ~]$ echo "$USER $((2+2)) $(cal)"
me 4 February 2008
Su Mo Tu We Th Fr Sa
                1  2
 3  4  5  6  7  8  9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29

Deberíamos tomarnos un momento para mirar el efecto de las comillas dobles en la sustitución de comandos. Primero miremos un poco más atentamente a cómo funciona la separación de palabras. En nuestro ejemplo anterior, vimos como la separación de palabras parece eliminar los espacios sobrantes en nuestro texto:

[me@linuxbox ~]$ echo this is a      test
this is a test

Por defecto, la separación de palabras busca la presencia de espacios, tabulaciones y líneas nuevas (caracteres de salto de línea) y las trata como delimitadores entre palabras. Esto significa que los espacios, tabuladores y nuevas líneas, cuando no están entre comillas dobles, no se consideran parte del texto. Sólo sirven como separadores. Como separan las palabras en diferentes argumentos, nuestro ejemplo de la línea de comandos contiene un comando seguido de cuatro argumentos distintos. Si añadimos comillas dobles:

[me@linuxbox ~]$ echo "this is a       test"
this is a      test

la separación de palabras se suprime y los espacios en blanco no se tratan como separadores, en lugar de eso pasan a ser parte del argumento. Una vez que añadimos las comillas dobles, nuestra línea de comandos contiene un comando seguido de un único argumento.

El hecho de que las líneas nuevas sean consideradas como separadores por el mecanismo de separación de palabras provoca un interesante, aunque sutil, efecto en la sustitución de comandos. Considera lo siguiente:

[me@linuxbox ~]$ echo $(cal)
February 2008 Su Mo Tu We Th Fr Sa 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
[me@linuxbox ~]$ echo "$(cal)"
    February 2008
Su Mo Tu We Th Fr Sa
                 1 2
       3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29

En el primer caso,  la sustitución de comandos sin comillas resulta en una línea de comandos que contiene 38 argumentos. En el segundo, una linea de comandos con un argumento que incluye los espacios en blanco y las nuevas líneas.

No hay comentarios:

Publicar un comentario