Расширяющиеся переменные Bash Scripting - PullRequest
3 голосов
/ 28 февраля 2012

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

echo $sala
a
echo $i
10

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

Ответы [ 4 ]

3 голосов
/ 28 февраля 2012

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

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}.Этот способ в целом менее безопасен - его поведение немного более хаотично зависит от значений параметров - но для него не требуется временная переменная.

1 голос
/ 28 февраля 2012

Вы можете сделать это через косвенное обращение:

$ 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
1 голос
/ 28 февраля 2012

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

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

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

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

1 голос
/ 28 февраля 2012

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

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

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

   result=$(eval "echo \${$sala$i}")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...