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