Bash script: cadenas con comillas dobles como argumentos de programas
Hacía tiempo que no me encontraba con un problema de bash script de los que hacen rebanarte los sesos y tirarte un buen rato googleando para hallar la solución. Pero como podéis imaginar si escribo acerca de ello es que he conseguido darle solución, y a continuación os lo contaré con todo gusto, que después de un tiempo sin escribir en el blog debido a mis bien merecidas vacaciones, ya tenía ganas de escribir algo
.
Sin más dilación paso a describir el problema con el que me encontraba. He escrito un programita que aceptaba como uno de los argumentos una cadena de texto con varias palabras separadas por espacios. Para que el programa reconociese dicho argumento como una sola cadena tenía que entrecomillar la cadena con comillas dobles. Hasta aquí no había problema, una llamada a mi aplicación tiene el siguiente aspecto:
./miprograma -i "palabra1 palabra2 palabra3" -o salida
El problema me ha surgido cuando he querido llamar a mi aplicación desde un bash script. En los scripts, para hacer mostrar una comillas dobles normalmente hay que usar el carácter de escape, teniendo esto en cuenta la línea de mi script que lanzaba la aplicación tenía este aspecto:
$program -i \"$listOfMHV\" -o $i.psf
Poniendo un echo delante de esa línea observaba que el resultado que obtenía era exactamente el que esperaba, pero sin embargo, el programa tomaba las comillas dobles como un carácter de la primera palabra y no como el delimitador que indicaba el comienzo de una cadena hasta encontrar las siguientes comillas dobles. Después de muchos intentos infructuosos, y tras googlear un buen rato, di con una página que me dirigió hacia una simple solución. Dicha solución consiste en utilizar el comando eval para ejecutar el comando anterior:
eval $program -i \"$listOfMHV\" -o $i.psf
El cometido del programa eval es construir un comando mediante la concatenación de los argumentos especificados y separando cada argumento por un espacio. El comando generado es posteriormente leído y ejecutado por la terminal, y de este modo interpreta las comillas doble como los delimitadores de una única cadena.
loading...

Últimos comentarios