Кажется, рекомендуемый способ косвенной установки переменных в 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//\'/\'\"\'\"\'}"'"