Ответ 1
Да, но не делайте этого. Вместо этого используйте массив.
Если вы все еще настаиваете на том, чтобы делать это таким образом...
$ foo1=123
$ bar=foo1
$ echo "${!bar}"
123
Я прошу прощения за довольно ужасный титул - и сообщение о низком качестве - но я в основном хочу это сделать:
for I in 1 2 3 4
echo $VAR$I # echo the contents of $VAR1, $VAR2, $VAR3, etc.
Очевидно, что это не работает - он будет (я думаю) попробовать и повторить переменную с именем $VAR$I
Возможно ли это в Bash?
Да, но не делайте этого. Вместо этого используйте массив.
Если вы все еще настаиваете на том, чтобы делать это таким образом...
$ foo1=123
$ bar=foo1
$ echo "${!bar}"
123
for I in 1 2 3 4 5; do
TMP="VAR$I"
echo ${!TMP}
done
У меня есть общее правило: если мне нужен косвенный доступ к переменным (массивы ditto), то пришло время преобразовать script из оболочки в Perl/Python/etc. Расширенное кодирование в оболочке, хотя возможно, быстро становится беспорядком.
Вы должны подумать об использовании массивов bash
для такого рода работ:
pax> set arr=(9 8 7 6)
pax> set idx=2
pax> echo ${arr[!idx]}
7
В случае, когда вы не хотите реорганизовывать переменные в массивы...
Один из способов...
$ 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
for I in {1..5}; do
echo $((VAR$I))
done
Это определенно выглядит как тип массива. Здесь ссылка, которая имеет очень хорошее обсуждение (со многими примерами) использования массивов в bash: Arrays