Переменная удара твердости containted в другой переменной

У меня есть код как этот:

TEXT_TO_FILTER='I would like to replace this $var to proper value
                in multiline text'
var=variable

Все, что я хочу получить:

TEXT_AFTER_FILTERED="I'd like to replace this variable to proper value"

Таким образом, я сделал:

TEXT_AFTER_FILTERED=`eval echo $TEXT_TO_FILTER`
TEXT_AFTER_FILTERED=`eval echo $(eval echo $TEXT_TO_FILTER)`

Или еще больше более странных вещей, но без любых эффектов. Я помню, что когда-нибудь у меня была подобная проблема, и я сделал что-то как этот:

cat << EOF > tmp.sh
echo $TEXT_TO_FILTER
EOF
chmod +x tmp.sh
TEXT_AFTER_FILTERED=`. tmp.sh`

Но это решение, кажется, к большому количеству комплекса. Какой-либо из Вас услышал о более легком решении?

5
задан kokosing 18 May 2010 в 09:36
поделиться

2 ответа

Из соображений безопасности лучше избегать eval . Было бы предпочтительно что-то вроде этого:

TEXT_TO_FILTER='I would like to replace this %s to proper value'
var=variable
printf -v TEXT_AFTER_FILTERED "$TEXT_TO_FILTER" "$var"
# or TEXT_AFTER_FILTERED=$(printf "$TEXT_TO_FILTER" "$var")
echo "$TEXT_AFTER_FILTERED"
3
ответ дан 14 December 2019 в 13:28
поделиться
TEXT_AFTER_FILTERED="${TEXT_TO_FILTER//\$var/$var}"

или, используя perl:

export var
TEXT_AFTER_FILTERED="$(echo "$TEXT_TO_FILTER" | perl -p -i -e 's/\$(\S+)/$ENV{$1} || $&/e')"

Это все еще более безопасно, чем eval.

3
ответ дан 14 December 2019 в 13:28
поделиться
Другие вопросы по тегам:

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