2012-02-27 3 views
3

У меня есть две переменные в Баш, завершивших имя другого, и я хочу, чтобы развернуть его, но не знают, как сделать это у меня есть:расширяющие переменные Bash Scripting

echo $sala 
a 
echo $i 
10 

и я хочу для расширения ${a10} в этой форме ${$sala$i}, но, по-видимому, {} scape $ знаков.

+0

Что ты делаешь? Похоже, вам нужен массив. – Sorpigal

ответ

3

Существует несколько способов с различными преимуществами и недостатками. Самый безопасный способ, чтобы сохранить полное имя параметра в одном параметре, а затем использовать окольные расширить его:

tmp="$sala$i"  # sets $tmp to 'a10' 
echo "${!tmp}" # prints the parameter named by $tmp, namely $a10 

Немного более простой способ является командой, как это:

eval echo \${$sala$i} 

, который будет работать eval с аргументами echo и ${a10}, и поэтому бежать echo ${a10}. Этот способ менее безопасен вообще —, его поведение немного более хаотично зависит от значений параметров —, но для этого не требуется временная переменная.

+0

@ user1236560: Добро пожаловать! Но теперь я вижу, что несколько человек предложили вам использовать массив, который я считаю хорошей идеей: вместо переменных с именем '$ a10',' $ b7' и т. Д. - если это то, что у вас есть, - у вас может быть массив с именем 'arr' с такими индексами, как' 'a10'' и' 'b7'' и так далее. Это позволит вам писать просто '' $ {arr [$ sala $ i]} "'. – ruakh

+0

это не работает, потому что я не могу поставить что-то отличное от чисел в индексе массива – Josepas

+0

@ user1236560: Да, я не удивлен. Баш только добавлял поддержку, например. '$ {arr [a10]}' в версии 4.0, и многие машины по-прежнему работают с версиями 3.x. – ruakh

1

Используйте eval.

eval "echo \${$sala$i}" 

Поместите это значение в другую переменную.

result=$(eval "echo \${$sala$i}") 
1

Обычный ответ eval:

sala=a 
i=10 
a10=37 
eval echo "\$$sala$i" 

Это перекликается 37. Вы можете использовать "\${$sala$i}", если вы предпочитаете.

Опасайтесь eval, особенно если вам нужно сохранить пробелы в списках аргументов. Он очень мощный и очень запутанный. Он будет работать со старыми раковинами, а также с Bash, что может быть или не быть заслугой в ваших глазах.

1

Вы можете сделать это с помощью косвенности:

$ a10=blah 
$ sala=a 
$ i=10 
$ ref="${sala}${i}" 
$ echo $ref 
a10 
$ echo ${!ref} 
blah 

Однако, если у вас есть индексы, как это ... массив может быть более подходящим:

$ declare -a a 
$ i=10 
$ a[$i]="test" 
$ echo ${a[$i]} 
test 
Смежные вопросы