Esta pregunta no se trata de cómo escribir un literal de cadena con escape correcto. No pude encontrar ninguna pregunta relacionada que no se trata de cómo escapar de las variables para el consumo directo dentro de un script o por otros programas.
Mi objetivo es habilitar un script para generar otros scripts. Esto se debe a que las tareas en los scripts generados se ejecutarán en cualquier lugar de 0 a n veces en otra máquina, y los datos a partir de los cuales se generan pueden cambiar antes de ejecutarse (nuevamente), por lo que realizar las operaciones directamente, a través de una red no trabajo.
Dada una variable conocida que puede contener caracteres especiales como comillas simples, necesito escribirla como un literal de cadena completamente escapado, por ejemplo, una variable que foo
contenga bar'baz
debería aparecer en el script generado como:
qux='bar'\''baz'
que se escribiría agregando "qux=$foo_esc"
a las otras líneas del guión. Lo hice usando Perl así:
foo_esc="'`perl -pe 's/('\'')/\\1\\\\\\1\\1/g' <<<"$foo"`'"
Pero esto parece una exageración.
No he tenido éxito en hacerlo solo con bash. He intentado muchas variaciones de estos:
foo_esc="'${file//\'/\'\\\'\'}'"
foo_esc="'${file//\'/'\\''}'"
pero aparecen barras diagonales adicionales en la salida (cuando lo hago echo "$foo"
), o causan un error de sintaxis (esperando una entrada adicional si se realiza desde el shell).
alias "varname=$varname" varname
ovar=value set
alias
y / oset
bastante universalmente