[room] [tip] bash: как получить имя переменной, имя которой -- в другой переменной

Michael Shigorin =?iso-8859-1?q?mike_=CE=C1_osdn=2Eorg=2Eua?=
Чт Ноя 8 20:12:25 MSK 2007


	Здравствуйте.
В процессе возни с бэкендом для альтераторового модуля наткнулся
на "было бы неплохо здесь взять имя переменной из другой
переменной".  Попробовал (смутно помня, что когда-то с eval и \
такое делал); спросил коллег; наконец, погуглил:

bash variable "name from variable"

=> http://www.linuxquestions.org/questions/programming-9/bash-how-to-get-variable-name-from-variable-274718/

A="abcd dcba"
B=A
C=${!B}
echo $C

A="abcd dcba"
B=A
C='eval "echo \$$B"'
eval "$C"

или как вариант --

name=a; a=1; eval echo \$$name

name=a; a=1; eval c=\$$name

Первый вариант (с ${!B}) -- явно sh/bash specific, по крайней
мере мой zsh так не смог; eval \$$name работает в sh/bash/zsh/ash.

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

       ${!prefix*}
       ${!prefix@}
              Expands to the names of variables whose names begin with prefix,
              separated by the first character of the IFS special variable.

       ${!name[@]}
       ${!name[*]}
              If  name  is  an  array  variable,  expands to the list of array
              indices (keys) assigned in name.   If  name  is  not  an  array,
              expands  to 0 if name is set and null otherwise.  When @ is used
              and the expansion appears within double quotes, each key expands
              to a separate word.

Может, кому-нибудь пригодится :)

-- 
 ---- WBR, Michael Shigorin <mike на altlinux.ru>
  ------ Linux.Kiev http://www.linux.kiev.ua/



Подробная информация о списке рассылки smoke-room