Кажется, что рекомендуемый способ настройки косвенных переменных в bash состоит в использовании eval
:
var=x; val=foo
eval $var=$val
echo $x # --> foo
Проблема является обычной с eval
:
var=x; val=1$'\n'pwd
eval $var=$val # bad output here
(и поскольку он рекомендуется во многих местах, мне интересно, сколько скриптов уязвимо из-за этого...)
В любом случае очевидное решение использования (экранированных) кавычек действительно не работает:
var=x; val=1\"$'\n'pwd\"
eval $var=\"$val\" # fail with the above
Дело в том, что bash имеет ссылку на косвенные переменные, запеченные в (с ${!foo}
), но я не вижу такого способа делать косвенное назначение - существует ли разумный способ сделать это?
Для записи я нашел решение, но это не то, что я считаю "разумным"...:
eval "$var='"${val//\'/\'\"\'\"\'}"'"