Cette question n'est pas sur la façon d'écrire un littéral de chaîne correctement échappé. Je n'ai trouvé aucune question connexe qui ne concerne pas comment échapper des variables pour une consommation directe dans un script ou par d'autres programmes.
Mon objectif est de permettre à un script de générer d'autres scripts. En effet, les tâches dans les scripts générés s'exécuteront de 0 à n fois sur une autre machine, et les données à partir desquelles elles sont générées peuvent changer avant d'être exécutées (à nouveau), de sorte que les opérations directement, sur un réseau ne fonctionne pas.
Étant donné une variable connue qui peut contenir des caractères spéciaux tels que des guillemets simples, je dois l'écrire comme un littéral de chaîne complètement échappé, par exemple une variable foo
contenant bar'baz
devrait apparaître dans le script généré comme:
qux='bar'\''baz'
qui serait écrit en ajoutant "qux=$foo_esc"
aux autres lignes de script. Je l'ai fait en utilisant Perl comme ceci:
foo_esc="'`perl -pe 's/('\'')/\\1\\\\\\1\\1/g' <<<"$foo"`'"
mais cela semble exagéré.
Je n'ai pas réussi à le faire avec bash seul. J'ai essayé de nombreuses variantes de celles-ci:
foo_esc="'${file//\'/\'\\\'\'}'"
foo_esc="'${file//\'/'\\''}'"
mais soit des barres obliques supplémentaires apparaissent dans la sortie (quand je le fais echo "$foo"
), soit elles provoquent une erreur de syntaxe (en attendant des entrées supplémentaires si elles sont effectuées à partir du shell).
alias "varname=$varname" varname
ouvar=value set
alias
et / ouset
assez universellement