Использование переменной для ссылки на другую переменную в Bash
x=1
c1=string1
c2=string2
c3=string3
echo $c1
string1
Я хотел бы, чтобы результат был string1
, используя что-то вроде:
echo $(c($x))
Так что позже в script я могу увеличить значение x
и вывести его string1
, затем string2
и string3
.
Может ли кто-нибудь указать мне в правильном направлении?
Ответы
Ответ 1
См. раздел Bash FAQ: Как использовать переменные переменные (косвенные переменные, указатели, ссылки) или ассоциативные массивы?
Чтобы привести свой пример:
realvariable=contents
ref=realvariable
echo "${!ref}" # prints the contents of the real variable
Чтобы показать, как это полезно для вашего примера:
get_c() { local tmp; tmp="c$x"; printf %s "${!tmp}"; }
x=1
c1=string1
c2=string2
c3=string3
echo "$(get_c)"
Если, конечно, вы хотите сделать это правильно и просто использовать массив
c=( "string1" "string2" "string3" )
x=1
echo "${c[$x]}"
Обратите внимание, что эти массивы нуль-индексируются, поэтому с x=1
он печатает string2
; если вы хотите string1
, вам понадобится x=0
.
Ответ 2
если у вас есть bash 4.0, вы можете использовать ассоциативные массивы.. Или вы можете просто использовать arrays. Другим инструментом, который вы можете использовать, является awk
например,
awk 'BEGIN{
c[1]="string1"
c[2]="string2"
c[3]="string3"
for(x=1;x<=3;x++){
print c[x]
}
}'
Ответ 3
Попробуйте следующее:
eval echo \$c$x
Как и другие, в этом случае имеет смысл использовать массив.