Этот вопрос не о том, как написать правильно экранированный строковый литерал. Я не смог найти ни одного связанного вопроса, который бы не касался того, как экранировать переменные для непосредственного использования в скрипте или другими программами.
Моя цель - включить скрипт для генерации других скриптов. Это связано с тем, что задачи в сгенерированных сценариях будут выполняться от 0 до n раз на другом компьютере, и данные, из которых они сгенерированы, могут измениться до того, как они будут выполнены (снова), поэтому выполнение операций напрямую по сети приведет к не работает.
Учитывая известную переменную, которая может содержать специальные символы, такие как одинарные кавычки, мне нужно записать это как полностью экранированный строковый литерал, например, foo
содержащая переменная bar'baz
должна появиться в сгенерированном скрипте как:
qux='bar'\''baz'
который будет написан путем добавления "qux=$foo_esc"
к другим строкам сценария. Я сделал это с помощью Perl следующим образом:
foo_esc="'`perl -pe 's/('\'')/\\1\\\\\\1\\1/g' <<<"$foo"`'"
но это кажется излишним.
У меня не было успеха в том, чтобы сделать это только с Bash. Я пробовал много вариантов этих:
foo_esc="'${file//\'/\'\\\'\'}'"
foo_esc="'${file//\'/'\\''}'"
но либо лишние косые черты появляются в выводе (когда я это делаю echo "$foo"
), либо они вызывают синтаксическую ошибку (ожидая дальнейшего ввода, если это сделано из оболочки).
alias "varname=$varname" varname
илиvar=value set
alias
и / илиset
довольно универсально