To pytanie nie dotyczy tego, jak napisać poprawnie literał łańcucha znaków. Nie mogłem znaleźć żadnego powiązanego pytania, które nie dotyczyłoby ucieczki przed zmiennymi w celu bezpośredniego wykorzystania w skrypcie lub przez inne programy.
Moim celem jest umożliwienie skryptowi generowania innych skryptów. Wynika to z faktu, że zadania w wygenerowanych skryptach będą uruchamiane w dowolnym miejscu od 0 do n razy na innym komputerze, a dane, z których zostały wygenerowane, mogą ulec zmianie przed ich uruchomieniem (ponownie), więc wykonywanie operacji bezpośrednio, przez sieć nie działa.
Biorąc pod uwagę znaną zmienną, która może zawierać znaki specjalne, takie jak pojedyncze cudzysłowy, muszę ją zapisać jako dosłowny ciąg znaków, np. Zmienna foo
zawierająca bar'baz
powinna pojawić się w wygenerowanym skrypcie jako:
qux='bar'\''baz'
który zostałby napisany przez dodanie "qux=$foo_esc"
do innych wierszy skryptu. Zrobiłem to przy użyciu Perla w następujący sposób:
foo_esc="'`perl -pe 's/('\'')/\\1\\\\\\1\\1/g' <<<"$foo"`'"
ale wydaje się, że to przesada.
Nie odniosłem sukcesu, robiąc to sam z bash. Próbowałem wielu odmian tych:
foo_esc="'${file//\'/\'\\\'\'}'"
foo_esc="'${file//\'/'\\''}'"
ale albo dodatkowe ukośniki pojawiają się na wyjściu (kiedy to robię echo "$foo"
), albo powodują błąd składniowy (oczekując dalszych danych wejściowych, jeśli zrobione z powłoki).
alias "varname=$varname" varname
lubvar=value set
alias
i / lubset
dość ogólnie