Определить строку с символами *, одинарной кавычкой и $

Я создаю сценарии bash, которые берутся из другого «основного» сценария для установки переменных, необходимых для основного сценария. Эти переменные должны иметь возможность содержать любой символ и не интерпретировать их оболочкой. Например:

  • одинарная кавычка: '
  • знак доллара: $
  • звездочка: *
  • знак фунта: # и т. Д.

Итак, я решил использовать одинарную кавычку и избегать любых заключенные в одинарные кавычки и символы # . Но я получаю неожиданный EOF при поиске совпадения ошибки с двумя файлами ниже.

Вопрос:

  1. Как лучше всего определить строку, которая может содержать любой набор символов, требующий минимальной настройки?

    Существуют тысячи таких файлов foo.sh , и поскольку строка извлекается из другого источника, я хочу минимизировать количество специальных символов, которые мне нужно экранировать.

  2. Какие еще персонажи мне нужны, чтобы сбежать.

Желаемый результат следующих сценариев ниже:

\MyMacro{*,Baker's Dozen,$x^$,#}

Платформа:

  • MacOS 10.9.5

Подоболочка: foo.sh

set -f
string_list='*,Baker\'s Dozen,$x^$,\#'
set +f

Основная оболочка: main.sh

source foo.sh
printf "%s{%s}" "\MyMacro" "${string_list}"
0
25.02.2016, 23:52
2 ответа

Не нужно экранировать # внутри кавычек, и странно иметь буквальную одинарную кавычку внутри одинарной:

string_list='*,Baker'\''s Dozen,$x^$,#'

Но с двойными кавычками проще. Поэтому подойдет что-то вроде:

string_list="*,Baker's Dozen,\$x^\$,#"

-.

Вам нужно только "\" для двойной кавычки, вместо ''\'' для одинарной кавычки, а также экранирование $ для предотвращения расширения переменной.

Если вы хотите минимизировать экранирование, то измените все ' внутри одинарной кавычки на ''''''':

string_list='*,Baker'"'"'s Dozen,$x^$,#'
1
28.01.2020, 02:35

Вы можете избежать экранирования, но с немного большими накладными расходами, используя что-то вроде этого:

string_list=$(cat <<\!eof!
*,Baker's Dozen,$x^$,#
!eof!
)

где вы указываете stdin, который является текущим документом, который не будет иметь обработка сделана к нему. Вы даже можете использовать обратную косую черту, одинарные и двойные кавычки, пробелы и несколько строк в строке. Чтобы быть немного более эффективным, вы можете использовать это:

read string_list <<\!eof!
*,Baker's Dozen,$x^$,#
!eof!

, но вы потеряете все начальные пробелы и любые обратные косые черты.

1
28.01.2020, 02:35

Теги

Похожие вопросы