Эвал безумие в кш - PullRequest
       26

Эвал безумие в кш

3 голосов
/ 09 августа 2011

Человек, которого я ненавижу eval ...

Я застрял с этим ksh, и он имеет , чтобы быть таким.

Есть эта функциянужно, которое получит имя переменной и значение.Будет делать некоторые вещи с содержимым этой переменной и значением, а затем придется обновить полученную переменную.Сортировка:

REPORT="a text where TADA is wrong.."

setOutputReport REPORT "this"

echo $REPORT
a text where this is wrong..

Там, где функция будет выглядеть примерно так:

function setOutputReport {
    eval local currentReport=\$$1
    local reportVar=$1
    local varValue=$2

    newReport=$(echo "$currentReport"|sed -e 's/TADA/$varValue')

    # here be dragons
    eval "$reportVar=\"$newReport\""
}

У меня раньше была такая головная боль, мне никогда не удавалось правильно получить этот eval.Важно, что переменная REPORT может содержать несколько строк (\n).Это может быть важно, поскольку одной из попыток удалось правильно заменить содержимое переменной только первой строкой: /

спасибо.

1 Ответ

2 голосов
/ 09 августа 2011

Один риск, не с eval, а с «varValue» в качестве замены в команде sed: если varValue содержит косую черту, команда sed сломается

local varValue=$(printf "%s\n" "$2" | sed 's:/:\\/:g')
local newReport=$(echo "$currentReport"|sed -e "s/TADA/$varValue/")

Если ваш printf имеет спецификатор% q, это добавит слой безопасности -% q экранирует такие вещи, как кавычки, обратные пометки и знаки доллара, а также экранирует символы типа newline и tab:

eval "$(printf "%s=%q" "$reportVar" "$newReport")"

Вот пример того, что делает% q (это bash, я надеюсь, что ваша версия ksh соответствует):

$ y='a `string` "with $quotes"
with multiple
lines'
$ printf "%s=%q\n" x "$y"
x=$'a `string` "with $quotes"\nand multiple\nlines'
$ eval "$(printf "%s=%q" x "$y")"
$ echo "$x"
a `string` "with $quotes"
and multiple
lines
...