Использование переменной для ссылки на другую переменную в Bash - PullRequest
21 голосов
/ 14 апреля 2010
x=1
c1=string1
c2=string2
c3=string3

echo $c1
string1

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

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

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

Ответы [ 3 ]

28 голосов
/ 14 апреля 2010

См. 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 голосов
/ 25 апреля 2010

Попробуйте это:

eval echo \$c$x

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

2 голосов
/ 14 апреля 2010

если у вас bash 4.0, вы можете использовать ассоциативные массивы. . Или вы можете просто использовать массивы . Еще один инструмент, который вы можете использовать, это awk

например

awk 'BEGIN{
  c[1]="string1"
  c[2]="string2"
  c[3]="string3"
  for(x=1;x<=3;x++){
    print c[x]
  }
}'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...