Косвенное присвоение переменных в bash

Кажется, что рекомендуемый способ установки косвенных переменных в bash - это использоватьeval:

var=x; val=foo
eval $var=$val
echo $x  # --> foo

Проблема обычная сeval:

var=x; val=1

(и поскольку это рекомендуется во многих местах, мне интересно, сколько сценариев уязвимо из-за этого ...)

В любом случае очевидное решение использования (экранированных) кавычек на самом деле не работает:

var=x; val=1\"

Дело в том, что bash имеет косвенную ссылку на переменную, запеченную в${!foo}), но я не вижу такого способа сделать косвенное назначение - есть ли какой-нибудь вменяемый способ сделать это?

Для протокола, я нашел решение, но это не то, что я бы посчитал "вменяемым" ...:

eval "$var='"${val//\'/\'\"\'\"\'}"'"
\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//\'/\'\"\'\"\'}"'"
\n'pwd\" eval $var=\"$val\" # fail with the above

Дело в том, что bash имеет косвенную ссылку на переменную, запеченную в${!foo}), но я не вижу такого способа сделать косвенное назначение - есть ли какой-нибудь вменяемый способ сделать это?

Для протокола, я нашел решение, но это не то, что я бы посчитал "вменяемым" ...:

eval "$var='"${val//\'/\'\"\'\"\'}"'"
\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//\'/\'\"\'\"\'}"'"

Ответы на вопрос(6)

Ваш ответ на вопрос