2015-06-18 2 views
2

Я реализую средство визуализации шаблона в сценарии оболочки. Переменные шаблона представлены в шаблоне @ VAR_NAME @, а их значения определены в отдельном сценарии оболочки.Создание команды sed через скрипт оболочки - цитаты и sed

код

Пример:

# template variables values 
CONTACT_EMAIL="myemail" 
CONTACT_NAME="myname" 
VARS="CONTACT_EMAIL CONTACT_NAME" 

TEMPLATE_FILEPATH="mytemplate.txt" 

# template renderer 
set -x 
SEDARGS= 
for VAR in $VARS; do 
    SEDARGS+=" -e \"s,@[email protected],${!VAR},\"" 
done 
sed -r $SEDARGS $TEMPLATE_FILEPATH 

СЕПГ команда, выполняемая оболочкой и распечатаны ею из-за "установить -x":

+ sed -r -e '"s,@[email protected],myemail,"' -e '"s,@[email protected],myname,"' mytemplate.txt 

СЕПГ выход:

sed: -e expression #1, char 1: unknown command: `"' 

Я знаю, одиночные кавычки вокруг каждого выражения sed вызывают это неинтуитивное сообщение об ошибке, но я не знаю, почему они adde д.

Что не так?

+1

Возможный дубликат [возможно ли избежать метасимволов регулярных выражений с помощью sed] (http://stackoverflow.com/questions/29613304/is-it-possible-to-escape-regex-metacharacters-reliably-with-sed) ... Я имею в виду * возможный *, и надеюсь, что эта ссылка поможет. – hek2mgl

+1

'SEDARGS + =" -e ', @ $ VAR @, $ {! VAR},' "' может работать. Интересная идея! удачи. – shellter

ответ

1

У вас есть встроенные кавычки внутри вашей переменной SEDARGS. Они не удаляются при выполнении команды. Чтобы удалить их, вам нужно снова вызвать интерпретатор, который вы можете сделать, используя eval. Например:

eval sed -r $SEDARGS $TEMPLATE_FILEPATH 

Возможно, вам придется поиграть с этим еще (добавление котировок и т. Д.).

+0

Это сработало, спасибо! Это очень сложно. Я предполагаю, что оболочка Linux сначала анализирует кавычки, а затем выполняет замену переменных? –

+0

Да. Он должен делать это в этом порядке, иначе одиночные кавычки не остановят расширение переменной. – rghome

0

Одиночные кавычки не являются частью фактических аргументов. Они добавляются вашей оболочкой для вывода, вызванного только set -x.

Зачем нужна оболочка? Чтобы вы могли использовать этот вывод для повторного запуска точно того, что было выполнено во время выполнения скрипта. Как вы правильно заметили, они необходимы, чтобы защитить ", которые пришли из SEDARGSсодержания (т.е. внутренние те, в сценарии экранированы, как \").

Смежные вопросы