Я создаю сценарии bash, которые берутся из другого «основного» сценария для установки переменных, необходимых для основного сценария. Эти переменные должны иметь возможность содержать любой символ и не интерпретировать их оболочкой. Например:
Итак, я решил использовать одинарную кавычку и избегать любых заключенные в одинарные кавычки и символы #
. Но я получаю неожиданный EOF при поиске совпадения ошибки
с двумя файлами ниже.
Как лучше всего определить строку, которая может содержать любой набор символов, требующий минимальной настройки?
Существуют тысячи таких файлов foo.sh
, и поскольку строка извлекается из другого источника, я хочу минимизировать количество специальных символов, которые мне нужно экранировать.
Какие еще персонажи мне нужны, чтобы сбежать.
Желаемый результат следующих сценариев ниже:
\MyMacro{*,Baker's Dozen,$x^$,#}
set -f
string_list='*,Baker\'s Dozen,$x^$,\#'
set +f
source foo.sh
printf "%s{%s}" "\MyMacro" "${string_list}"
Не нужно экранировать #
внутри кавычек, и странно иметь буквальную одинарную кавычку внутри одинарной:
string_list='*,Baker'\''s Dozen,$x^$,#'
Но с двойными кавычками проще. Поэтому подойдет что-то вроде:
string_list="*,Baker's Dozen,\$x^\$,#"
-.
Вам нужно только "\"
для двойной кавычки, вместо ''\''
для одинарной кавычки, а также экранирование $
для предотвращения расширения переменной.
Если вы хотите минимизировать экранирование, то измените все '
внутри одинарной кавычки на '''''''
:
string_list='*,Baker'"'"'s Dozen,$x^$,#'
Вы можете избежать экранирования, но с немного большими накладными расходами, используя что-то вроде этого:
string_list=$(cat <<\!eof!
*,Baker's Dozen,$x^$,#
!eof!
)
где вы указываете stdin, который является текущим документом, который не будет иметь обработка сделана к нему. Вы даже можете использовать обратную косую черту, одинарные и двойные кавычки, пробелы и несколько строк в строке. Чтобы быть немного более эффективным, вы можете использовать это:
read string_list <<\!eof!
*,Baker's Dozen,$x^$,#
!eof!
, но вы потеряете все начальные пробелы и любые обратные косые черты.