Как оценить текстовые строки, предоставленные sed/grep/независимо?

Это для программирования оболочки UNIX. Он должен поддерживаться несколькими платформами UNIX, включая Solaris, Linux и AIX.

У меня есть такой сценарий: я должен прочитать из текстового файла строку, которая может содержать или не содержать переменную среды, которая может быть определена или не определена. Например:

<foo.bar> This error code was found: $(error_code)

У меня есть следующий код:

statement=$(sed -n $1'p' $messagefile)
echo $echo_flag $statement

$1 = номер строки, указанный для этой конкретной функции/скрипта.
$messagefile = имя файла журнала.
$echo_flag = "-e" в Linux, иначе пусто.
$(код_ошибки) = 42.

Вместо того, чтобы получать это при запуске:

<foo.bar> This error code was found: 42

Я все еще получаю это:

<foo.bar> This error code was found: $(error_code)

Как именно мне сообщить сценарию оболочки, что значение оператора должно оцениваться дальше, чем то, что сделал sed?


person T.J.    schedule 22.12.2010    source источник
comment
Я прочитал три раза, но должен сказать, что не понимаю, что вы говорите.   -  person Yantao Xie    schedule 23.12.2010


Ответы (2)


К сожалению, входной текст использует $(код_ошибки) в качестве синтаксиса, потому что это похоже на подстановку процесса в оболочку. «eval» ближе к тому, что вы хотите, но это также риск для безопасности, если вы принимаете ввод, контролируемый пользователем, и выполняете его напрямую.

Был найден такой код ошибки: rm -rf /

Что вам нужно сделать, так это проанализировать строку ввода для ожидаемого синтаксиса и обработать токен «код_ошибки» сам по себе, протестировать шеллвар в области видимости, распечатать измененный вывод и т. д.

person PhilR    schedule 23.12.2010

Я не уверен, что понимаю, о чем вы спрашиваете, но изменение команды echo на eval echo $echo_flag $statement сделает то, что вы хотите?

person Steve Emmerson    schedule 23.12.2010
comment
Единственная проблема заключается в том, что $(error_code) выглядит как подстановка команды вместо переменной и выдает ошибку. Прежде чем вы сможете выполнить eval, необходимо будет выполнить дальнейший синтаксический анализ. - person Dennis Williamson; 23.12.2010