Это работает:
#!/bin/bash
for x in 0 1 2 3; do
export FVAR$x="Is's $x"
done
env | grep FVAR
Выполнение:
$./fvar.sh
FVAR3=Is's 3
FVAR2=Is's 2
FVAR1=Is's 1
FVAR0=Is's 0
export "${!FVAR[$i]}"=...
Это предполагает, что FVAR
является массивом, и пытается использовать его элемент в индексе $i
в качестве имени переменной для расширения в этой командной строке. (То есть a=11; b=22; c=33; p=(a b c); echo ${!p[1]}
напечатает 22
, поскольку p[1]
равно b
, $b
равно 22
.)
FVAR[0]
и т. д. не содержат имен переменных в этом скрипте, так что подстановка приводит к пустой строке.
Вы должны иметь возможность использовать только
for i in 1 2 3 4 5; do
export "FVAR$i=$(generate some value from $i)"
done
, так как export
обрабатывает имя переменной после расширения. Однако это не относится к обычному заданию. FVAR$i=$(...)
не работает.
Конечно, в зависимости от того, что вы делаете, могут быть и другие способы, например объединение всех значений в одну переменную и ее экспорт.
FVARS="$(generate some value from 1)"
for i in 2 3 4 5 ; do
FVARS+=":$(generate some value from $i)"
done
export FVARS
Хотя это требует резервирования некоторого символа для использования в качестве разделителя, и организация установки сепаратора в нужном месте и т. д.