Utilização de Variáveis Array com a Bourne Shell
Luciano Andress Martini | 20 de julho de 2008Bourne shell, popularmente conhecida como Shell Script é uma das mais poderosas linguagens para resolver seus problemas utilizando Linux.
Neste artigo ensino a trabalhar com arrays em shell script.
O que são Arrays?
Arrays são variáveis capazes de armazenar multiplos valores, e serem processadas dentro de laços para por exemplo processar as notas de um aluno.
Não é preciso declarar as Arrays ou chutar valores máximos para a Array, as variáveis em shell são dinâmicas, isto é, Bourne Shell é capaz de aumentar o tamanho de uma variável conforme precisamos de mais espaço.
Veja como os dados são armazenados em Arrays:
As váriaveis serão criadas automaticamente, use a atribuição de valores como mostrado abaixo:
Sintaxe de Arrays em Shell Script: Nome_da_variavel[posição da array]=”valor inteiro, cadeia, texto(gigante) ou real”
Tomemos como exemplo a váriavel Notas:
Notas[1]=”5,5″
Notas[2]=”6,0″
Notas[3]=”7,25″
Notas[4]=”8,5″
Sintaxe para recuperação de valores de uma Array:
Uma vez armazenados os valores, poderemos obter o valor de uma Array, com a seguinte sintaxe: ${nome_da_variavel[posicao_da_array]
Veja um exemplo de script, para retornar valores de arrays:
#!/bin/bash
#Script por Luciano Andress Martini, le as notas dos alunos.
echo 'Digite as notas do aluno:'
for ((i=1;i<=10;i++)); do read notas[$i]; done
echo 'As notas do aluno são: '
#Observe que os simbolos {} são obrigatórios, ou a array retornará um valor nulo.
for ((i=1;i<=10;i++)); do echo ${notas[$i]}; done







Comentário postado por pbrito81
Ótimo artigo! Simples e direto. Só um detalhezinho: como saber o tamanho de um array, já que eles são dinâmicos?
Como eu disse as arrays não tem um tamanho fixo, aumentam sozinhas de tamanho de acordo com o dado que você precisa colocar nelas.
Por exemplo se você digitar:
#!/bin/bash
hora[1]=’doze horas’
#Foi declarada uma array hora, com uma única posição(1), do tipo cadeira(string).
#em seguida foi dado a ela o valor doze horas, por enquanto ela tem apenas uma posição…
hora[1]=’12′
#A array mudou seu tipo automaticamente para inteiro…
hora[2]=’14′
#A array hora agora tem duas posições de memória 1 e 2
hora[3]=’eu’
#A array hora agora é mista, tem dois tipos de dados inteiro e cadeia. Agora ela tem 3 posições de memória.
hora[3]=”
#A array hora agora voltou a ter apenas duas posições de memória… 1 e 2 e é do tipo inteiro
#legal não?
Comentário postado por pbrito81
Sim, é legal mesmo. Mas, imagine que você precise passar esse array como parâmetro para algum outro script, ou uma função. Ou que algum script retorne um array. Como saber o seu tamanho dinamicamente? É possível?
Bom creio que poderá usa-la normalmente em funções e em outros scripts com o export.
Para medir o tamanho da array você pode criar uma função usando um laço do tipo while, e medir cada posição de uma array parando quando encontrar uma posição em branco… Mas esta função será lenta.
Você poderá declara-la dentro de uma biblioteca para o seu programa bourne shell e chama-la no cabeçalho.
arquivo biblioteca.shlib======
arraysize(){
#Parâmetros que você passar para a função
#irão gerar automaticamente as variáveis $1, $2, $3 (sendo cada um deles)
#um parâmetro separado por espaço. Passe a variável.
#Em seguida faça um processamento usando laço while ou que desejar
#Se precisar de ajuda faça um comentário
}
outrasfuncoes(){ etc }
====fim do arquivo biblioteca.shlib
arquivo meu_script.sh=======
#!/bin/bash
#Declarando bibliotecas com ponto e caminho.
. ./biblioteca.shlib
. ./outrasbibliotecas.shlib etc…
minharray=[1]=23
minharray=[2]=”putz”
export minharray
#Chamando a função e medindo minhaarray
arraysize minhaarray
====== fim do arquivo meu_script.sh
Interpretando ou compilando o script:
Para interpretar:
bash meu_script.sh ou
chmod +x meu_script.sh
./meu_script.sh
Para compilar:
shc -r -f meu_script.sh
mv meu_script.sh.x script
./script
Comentário postado por pbrito81
Olha que legal, Luciano! Se você colocar um # antes do nome do array, o bash te retorna a quantidade de elementos, independentemente de qual posição eles estão:
exemplo:
a[0]=1
a[1]=3
a[10]=abcde
agora, ${#a[10]} retorna 5, que é o comprimento do valor de a[10],
e como a[*] retorna todos os valores do array, ${#a[*]} retorna a quantidade de valores!
Essa do # eu não conhecia. Experimente ${#PATH} por exemplo…
Valeu Luciano, por trazer a tona um recurso tão útil nos scripts, e que muita gente não conhecia (incluindo-me!).