Подтвердить что ты не робот

Возможно ли построить имена переменных из других переменных в bash?

Я прошу прощения за довольно ужасный титул - и сообщение о низком качестве - но я в основном хочу это сделать:

for I in 1 2 3 4
    echo $VAR$I # echo the contents of $VAR1, $VAR2, $VAR3, etc.

Очевидно, что это не работает - он будет (я думаю) попробовать и повторить переменную с именем $VAR$I Возможно ли это в Bash?

4b9b3361

Ответ 1

Да, но не делайте этого. Вместо этого используйте массив.

Если вы все еще настаиваете на том, чтобы делать это таким образом...

$ foo1=123
$ bar=foo1
$ echo "${!bar}"
123

Ответ 2

for I in 1 2 3 4 5; do
    TMP="VAR$I"
    echo ${!TMP}
done

У меня есть общее правило: если мне нужен косвенный доступ к переменным (массивы ditto), то пришло время преобразовать script из оболочки в Perl/Python/etc. Расширенное кодирование в оболочке, хотя возможно, быстро становится беспорядком.

Ответ 3

Вы должны подумать об использовании массивов bash для такого рода работ:

pax> set arr=(9 8 7 6)
pax> set idx=2
pax> echo ${arr[!idx]}
7

Ответ 4

В случае, когда вы не хотите реорганизовывать переменные в массивы...

Один из способов...

$ for I in 1 2 3 4; do TEMP=VAR$I ; echo ${!TEMP} ; done

Другой способ...

$ for I in 1 2 3 4; do eval echo \$$(eval echo VAR$I) ; done

Я не нашел более простой способ работы. Например, это не работает...

$ for I in 1 2 3 4; do echo ${!VAR$I} ; done
bash: ${!VAR$I}: bad substitution

Ответ 5

for I in {1..5}; do
    echo $((VAR$I))
done

Ответ 7

Это определенно выглядит как тип массива. Здесь ссылка, которая имеет очень хорошее обсуждение (со многими примерами) использования массивов в bash: Arrays