Косвенное присвоение переменной в bash

Кажется, рекомендуемый способ косвенной установки переменных в 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//\'/\'\"\'\"\'}"'"
34
задан Charles 3 September 2013 в 18:26
поделиться