Esta questão não é sobre como escrever uma literal de string com escape apropriado. Não consegui encontrar nenhuma pergunta relacionada que não seja sobre como escapar de variáveis para consumo direto em um script ou em outros programas.
Meu objetivo é habilitar um script para gerar outros scripts. Isso ocorre porque as tarefas nos scripts gerados serão executadas de 0 a n vezes em outra máquina, e os dados dos quais eles são gerados podem ser alterados antes de serem executados (novamente), fazendo as operações diretamente, através de uma rede não funciona.
Dada uma variável conhecida que pode conter caracteres especiais, como aspas simples, preciso escrevê-la como um literal de string totalmente escapado, por exemplo, uma variável que foo
contenha bar'baz
deve aparecer no script gerado como:
qux='bar'\''baz'
que seria escrito anexando "qux=$foo_esc"
às outras linhas de script. Eu fiz isso usando Perl assim:
foo_esc="'`perl -pe 's/('\'')/\\1\\\\\\1\\1/g' <<<"$foo"`'"
mas isso parece exagero.
Não tive sucesso em fazê-lo apenas com o bash. Eu tentei muitas variações destes:
foo_esc="'${file//\'/\'\\\'\'}'"
foo_esc="'${file//\'/'\\''}'"
mas as barras extras aparecem na saída (quando o faço echo "$foo"
) ou causam um erro de sintaxe (esperando uma entrada adicional se feita a partir do shell).
alias "varname=$varname" varname
ouvar=value set
alias
e / ouset
razoavelmente universal