2010-05-18 1 views
4

У меня есть подобный код:Resolve переменная Баш 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` 

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

+3

TEXT_AFTER_FILTERED = '' Eval эхо $ TEXT_TO_FILTER'', кажется, работает для меня – Mark

+0

Это будет работать нормально для меня, как хорошо, но у меня есть более сложное содержание TEXT_TO_FILTER (много линий, гольцы, как < > и т.д.). Таким образом, простой eval не будет работать – kokosing

ответ

1

Для security reasons лучше избегать 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 
+0

Это решение, которое я искал. Благодарю. – kokosing

3
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.

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