Eu suspeitaria da sua versão do Bash para começar. Eu estou nesta versão e posso definir matrizes muito bem.
$ bash --version
GNU bash, version 4.2.45(1)-release (x86_64-redhat-linux-gnu)
Exemplo
$ array[0]=0
$ array[1]=1
$ array[2]=2
Você pode recuperá-los individualmente:
$ echo ${array[0]}
0
$ echo ${array[1]}
1
$ echo ${array[2]}
2
Ou como uma lista:
$ echo "${array[@]}"
0 1 2
Você não pode simplesmente chamar o array como outra variável:
$ echo $array
0
Acredito que isso possa ter sido o que o levou a pensar que não estava funcionando corretamente. Também definir um elemento de matriz com o valor de outra variável também funciona.
Exemplo
$ newval=3
$ array[2]=$newval
$ echo "${array[@]}"
0 1 3
Você também pode usar printf
aqui. Isso mostra por que você deseja citar os resultados de ${array[@]}
. Mas primeiro vamos adicionar uma string ao array:
$ array[0]="a string"
Sem as aspas:
$ printf "%s\n" ${array[@]}
a
string
1
3
Com aspas:
$ printf "%s\n" "${array[@]}"
a string
1
3
Passando as coisas
Bem, você tem 2 táticas que você pode usar no Bash. Você pode simplesmente definir variáveis para que elas sejam globalmente definidas. Essa é frequentemente a técnica que a maioria das pessoas emprega.
O outro método envolve passar por valor, valores para funções dentro do Bash. Vou mostrar uma função básica onde eu passo 2 valores.
Exemplo
$ function hello() {
printf "I got arg1: %d and arg2: %d\n" $1 $2
}
Agora, quando eu executo com argumentos diferentes:
$ hello 1 2
I got arg1: 1 and arg2: 2
$ hello 3 4
I got arg1: 3 and arg2: 4
$ hello 3 blah
bash: printf: blah: invalid number
I got arg1: 3 and arg2: 0
Você pode ler mais sobre arrays e funções no Bash aqui para entender melhor as tecnologias.