Разрешить переменную bash, содержащуюся в другой переменной - PullRequest
5 голосов
/ 18 мая 2010

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

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`

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

Ответы [ 2 ]

3 голосов
/ 18 мая 2010
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 голосов
/ 18 мая 2010

По соображениям безопасности лучше избегать 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"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...