Ver Indice Geral da Apostila de Shell Script
Array
Array é como uma lista de variáveis com uma relação entre elas.
Parece complicado, mas vamos ver na prática:
nomes=("Pedro" "Alfredo" "José")
O que foi feito foi definir uma array com 3 nomes diferentes.
Outra forma de definir uma array é:
nomes[0]="Pedro"
nomes[1]="Alfredo"
nomes[2]="José"
Repare que ao definir a Array sempre é colocado um número entre colchetes, esse número é com um índice, assim é possível identificar um valor específico.
Veja também que o primeiro número é zero.
Como imprimir um valor de uma Array?
Muito simples, basta digitar ${nome_array[indice_a_ser_impresso]}
Vamos a um exemplo:
| exemplo_array.sh |
frutas=("Maçã" "Banana" "Mamão" "Abacaxi")
echo "A fruta de Indice 2 é: ${frutas[2]}"
|
| Mostrará na tela |
|
A fruta de Indice 2 é: Mamão
|
Lembre que:
o "indice 0" é a maçã,
o "indice 1" é a banana,
o "indice 2" é o mamão...
Juntando Array com o For
Suponha que tenha uma array e que tenha que imprimir todos valores dessa array e adicionando uma frase, como fazer?
| array_e_for.sh |
frutas=("Maçã" "Banana" "Mamão" "Abacaxi")
for ((x=0;x<=3;x++));
do
echo "A fruta de Indice ${x} é: ${frutas[$x]}"
done
|
Então toda vez que eu adicionar ou remover um valor da array terei que mecher no comando For manualmente?
Não. O array tem um comando que retorna quantos elementos tem dentro dele. Esse comando é:
${#nome_da_array[@]}
Vamos substituir nosso script então.
| array_e_for2.sh |
frutas=("Maçã" "Banana" "Mamão" "Abacaxi")
for ((x=0;x<=${#frutas[@]};x++));
do
echo "A fruta de Indice ${x} é: ${frutas[$x]}"
done
|
| Mostrará na tela |
A fruta de Indice 0 é: Maçã
A fruta de Indice 1 é: Banana
A fruta de Indice 2 é: Mamão
A fruta de Indice 3 é: Abacaxi
A fruta de Indice 4 é:
|
Você deve estar pensando agora: - Ei! Esse script e está com defeito.
Vamos com calma. Eu deixei errado para você ver o erro e pensar um pouco.
Agora vamos a explicação.
O "${#frutas[@]}" retorna quantos elementos têm na Array frutas. A array frutas contém 4 elementos.
Mas o FOR inicia no ponto ZERO porque o primeiro elemento de uma Array tem o índice ZERO.
Então o INDICE 0 é o primeiro elemento, certo?
Complicado a primeira vista, né?
Ao entrar no FOR o X está definido como 0 e o for deve ser executado até X atingir 4.
Veja só:
1 vez que entrou no FOR: X = 0
2 vez que entrou no FOR: X = 1
3 vez que entrou no FOR: X = 2
4 vez que entrou no FOR: X = 3
5 vez que entrou no FOR: X = 4
Achou o erro? Para X atingir o valor 4 ( número de elementos dentro do Array ) o FOR precisa ser executado 5 vezes.
Mas o que nós queremos é imprimir apenas até o último índice da array, esse índice é o número "3".
Logo a solução para nosso problema é: "${#frutas[@]} - 1"
| array_e_for3.sh |
frutas=("Maçã" "Banana" "Mamão" "Abacaxi")
for ((x=0;x<=$((${#frutas[@]}-1));x++));
do
echo "A fruta de Indice ${x} é: ${frutas[$x]}"
done
|
| Opções para usar com Arrays |
| ${#nome_array[@]} | Imprime o número de elementos da Array |
| ${nome_array[@]} | Imprime todos os elementos da Array |
| ${nome_array[@]:1} | Imprime do Indice 1 até o final da Array |
| ${nome_array[@]:1:3} | Imprime 3 Indices, começa a imprimir a partir do Indice 1 |
Veja a diferença dos comandos em um exemplo:
| comandos_array.sh |
indices=("Indice 0" "Indice 1" "Indice 2" "Indice 3" "Indice 4" "Indice 5")
echo "O #indices[@] o numero de indices dentro da array: ${#indices[@]}"
echo "O indices[@] imprime todos indices: ${indices[@]}"
echo "O indices[@]:3 imprime do indice 3 até o final: ${indices[@]:3}"
echo "O indices[@]:2:3 imprime 3 indices, começa a imprimir do indice 2: ${indices[@]:2:3}"
|
| Mostrará na tela |
O #indices[@] o numero de indices dentro da array: 6
O indices[@] imprime todos indices: Indice 0 Indice 1 Indice 2 Indice 3 Indice 4 Indice 5
O indices[@]:3 imprime do indice 3 até o final: Indice 3 Indice 4 Indice 5
O indices[@]:2:3 imprime 3 indices, começa a imprimir do indice 2: Indice 2 Indice 3 Indice 4
|
Nota: 9
Postado em: 2008-03-30
Ver Indice Geral da Apostila de Shell Script