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

Использование переменной для ссылки на другую переменную в Bash

x=1
c1=string1
c2=string2
c3=string3

echo $c1
string1

Я хотел бы, чтобы результат был string1, используя что-то вроде: echo $(c($x))

Так что позже в script я могу увеличить значение x и вывести его string1, затем string2 и string3.

Может ли кто-нибудь указать мне в правильном направлении?

4b9b3361

Ответ 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

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