Use uma variável como parte do nome de um nome de matriz?

2

Eu essencialmente tenho um loop for onde a variável i com a qual estou interagindo irá assumir cada letra do alfabeto, por exemplo. Eu quero usar cada valor de i para criar uma matriz chamada "$i"array (por exemplo aarray , barray , carray , darray , etc) ou até mesmo chamada "$i" (então as matrizes poderia ser chamado a , b , c , d , etc.).

Que tipo de sintaxe eu poderia usar para fazer isso acontecer?

Eu tentei:

for i in ${alphabet[@]}; do
    "$i"array[0]=0
done

e assim que eu tiver meu grupo de matrizes, posso iterá-los fazendo

for i in ${alphabet[@]}; do
    "$i"array[0]=1
done
    
por thatguy2000 16.01.2015 / 08:57

3 respostas

2

Posso oferecer outra maneira (via array associativo) para realizar sua tarefa? Parece mais inteligente e aceitável:

declare -A array
for i in ${alphabet[@]}; do
  array[$i]=0
  # or array[${i}0]=0 if you need 
done

Você pode iterar por for i in ${!array[@]} ou mesmo for i in ${alphabet[@]}

    
por 16.01.2015 / 11:28
1

Você pode usar eval builtin para avaliar o nome da variável. Um exemplo que ilustra o ponto:

i="a"
eval ${i}lphabet="abcde"
echo $alphabet

No entanto, recuperar o valor de ${i}lphabet requer outro truque. Você tem que usar o valor de uma variável como um nome de variável (essencialmente um ponteiro). A sintaxe seria:

#declare a variable that names the other variable:
pointer=${i}lphabet
#dereference the name with the ! syntax:
echo ${!pointer}

Aplicado ao seu caso:

for i in ${alphabet[@]}; do
    pointer="$i"array
    eval ${pointer}[0]=0
done

No entanto, este é um projeto ruim ... você deve encontrar uma maneira mais convencional de lidar com isso.

    
por 16.01.2015 / 09:15
1

Você terá que usar eval para usar o conteúdo de variáveis como nomes de variáveis:

for i in ${alphabet[@]}; do
    eval "$i[0]=1"
done

eval pega seus argumentos e os avalia no contexto do shell, ou seja, não como um shell separado, tentativas de fazer isso sem eval resultarão em shells separados sendo iniciados e, portanto, as variáveis definidas não estarão disponíveis na primeira casca.

    
por 16.01.2015 / 09:17