Bash script – Arrays Indexados
Os arrays são de grande utilidade na programação, com eles podemos organizar vários dados que podemos referencia-los por um único nome.
O BASH tem suporte a arrays de uma única dimensão o que realmente para certos fins pode ser pouco, mas é o que realmente temos com BASH. Quase todas as linguagens de programação suportam arrays multi dimensionais.
Um array indexado é uma variável especial, que guarda vários valores com o mesmo nome de variável. Para nos referirmos a um determinado valor utilizamos um índice. Em BASH o índice começa do zero até ao número de valores que existirem no array. Não existe limite quanto ao número de valores que um array pode conter.
Os arrays são a forma mais segura de guardar em memória vários valores. Também podemos guardar vários valores com variáveis normais, mas seria muito trabalhoso iniciar todas as variáveis que iríamos utilizar num script. E se o script gerar valores dinamicamente é impraticável. Para além de tudo isto o BASH lida muito bem com os arrays, o que vamos ver mais para a frente quando realmente os scripts de exemplo já forem mais complicados.
Neste artigo vou explicar como inicializar arrays indexados (que podemos fazer de várias formas), ver como podemos aceder aos valores que eles contêm tanto todo o array quanto apenas uma posição.
Inicializando Arrays Indexados
Como referi anteriormente existem várias formas de inicializarmos um array indexado. E vamos ver as várias formas para que possamos usar a que mais se adeqúe a cada situação. Então vamos ver as várias formas de inicializar os array indexado.
Uma forma simples, quando já temos os valores que o array indexado deve conter é esta.
nomes=(Miguel Sara João Catarina)
Desta forma inicializamos o array “nomes” já com os valores. Se os valores que usamos para inicializar o array contiver espaços temos obrigatoriamente de usar plicas ‘ ou aspas “ de forma que o BASH intenda que é apenas um único valor. Ora vejamos.
nomes=("José Miguel" "Sara Caldeira" "João Caldeira" "Catarina Caldeira")
Desta forma inicializamos o array com quatro valores, se não usarmos aspas ou plicas, inicializamos o array com oito valores.
Para podermos obter o valor que está guardado em cada índice de um array indexado utilizamos a seguinte sintaxe.
${nomes[0]}
Como podemos apreciar o nome do array fica entre chavetas e o índice fica entre parêntesis rectos. Como o índice dos arrays começam no número zero obteríamos o valor guardado na posição zero do array “nomes“. Se quisermos obter o valor guardado em outra posição do array só temos de mudar o índice.
Vamos experimentar estes conceitos com o seguinte script:
#!/bin/bash # inicializando um array com quatro valores nomes=(Miguel Sara João Catarina) # Escrever o valor guardado em cada posição do array echo "O valor guardado na posição zero é: ${nomes[0]}" echo "O valor guardado na posição um é: ${nomes[1]}" echo "O valor guardado na posição dois é: ${nomes[2]}" echo "O valor guardado na posição três é: ${nomes[3]}" # Escrever uma linha vazia echo # inicializando um array com quatro valores, contendo os valores espaços nomes=("José Miguel" "Sara Caldeira" "João Caldeira" "Catarina Caldeira") # Escrever o valor guardado em cada posição do array echo "O valor guardado na posição zero é: ${nomes[0]}" echo "O valor guardado na posição um é: ${nomes[1]}" echo "O valor guardado na posição dois é: ${nomes[2]}" echo "O valor guardado na posição três é: ${nomes[3]}" # Escrever uma linha vazia echo # Para que possamos perceber a importância de usar aspas ou plicas # este exemplo demonstra quanto errado e perigoso pode ser se não # as usarmos # inicializando um array com quatro valores, contendo os valores espaços # sem utilizarmos aspas ou plicas o que está errado. nomes=(José Miguel Sara Caldeira João Caldeira Catarina Caldeira) # Escrever o valor guardado em cada posição do array echo "O valor guardado na posição zero é: ${nomes[0]}" echo "O valor guardado na posição um é: ${nomes[1]}" echo "O valor guardado na posição dois é: ${nomes[2]}" echo "O valor guardado na posição três é: ${nomes[3]}"
Corremos o script desta forma:
miguel@LUA:~/Scripts/bash$ ./var_arrays_indexados_ex_1.sh O valor guardado na posição zero é: Miguel O valor guardado na posição um é: Sara O valor guardado na posição dois é: João O valor guardado na posição três é: Catarina O valor guardado na posição zero é: José Miguel O valor guardado na posição um é: Sara Caldeira O valor guardado na posição dois é: João Caldeira O valor guardado na posição três é: Catarina Caldeira O valor guardado na posição zero é: José O valor guardado na posição um é: Miguel O valor guardado na posição dois é: Sara O valor guardado na posição três é: Caldeira
Como podemos ver quando não usei aspas nem plicas para inicializar os nomes e sobrenomes correu mal, ao invés do BASH inicializar um array com quatro posições inicializou com oito posições. É importante usarmos aspas entre valores com espaços para não termos surpresas desagradáveis quando executamos os nossos scripts.
Também é possível obter todos os valores de um array, existe várias razões para fazermos e iremos ver ao longo dos artigos quando escrever sobre os ciclos em BASH. Para já apenas vamos escrevendo os valores. Quando queremos obter todos os seus valores a sintaxe é a seguinte:
${nomes[@]}
ou a seguinte
${nomes[*]}
Vamos experimentar estes conceitos com o seguinte script:
#!/bin/bash # inicializando um array com quatro valores nomes=(Miguel Sara João Catarina) # Escrever o valor guardado todo o array echo "O valores do array são: ${nomes[@]}" echo "O valores do array são: ${nomes[*]}"
Corremos o script desta forma:
miguel@LUA:~/Scripts/bash$ ./var_arrays_indexados_ex_2.sh O valores do array são: Miguel Sara João Catarina O valores do array são: Miguel Sara João Catarina
Outra forma de inicializar arrays indexados quando já temos os valores que queremos lá guardar é a seguinte:
nomes=([0]="José Miguel" [5]="Sara Caldeira" [3]="João Caldeira" [1]="Catarina Caldeira")
Desta forma podemos especificar concretamente o índice para cada valor, esta forma de inicializar é importante se precisarmos de um determinado valor numa determinada posição do array indexado.
Vamos experimentar estes conceitos com o seguinte script:
#!/bin/bash # inicializando um array com quatro valores nomes=([0]="José Miguel" [2]="Sara Caldeira" [3]="João Caldeira" [1]="Catarina Caldeira") # Escrever o valor guardado em cada posição do array echo "O valor guardado na posição zero é: ${nomes[0]}" echo "O valor guardado na posição um é: ${nomes[1]}" echo "O valor guardado na posição dois é: ${nomes[2]}" echo "O valor guardado na posição três é: ${nomes[3]}"
Corremos o script desta forma:
miguel@LUA:~/Scripts/bash$ ./var_arrays_indexados_ex_3.sh O valor guardado na posição zero é: José Miguel O valor guardado na posição um é: Catarina Caldeira O valor guardado na posição dois é: Sara Caldeira O valor guardado na posição três é: João Caldeira
Como podemos ver desta forma temos os valores ordenados à nossa maneira. E podemos contar com um determinado valor numa determinada posição do array.
Outra forma de inicializar o array é ir iniciando quando for necessário. Podemos inicializar uma posição e depois adicionar mais posições ao array. Ora vejamos.
Vamos experimentar estes conceitos com o seguinte script:
#!/bin/bash # inicializando um array com quatro valores nomes[0]="José Miguel" nomes[2]="Sara Caldeira" nomes[3]="João Caldeira" nomes[1]="Catarina Caldeira" # Escrever o valor guardado em cada posição do array echo "O valor guardado na posição zero é: ${nomes[0]}" echo "O valor guardado na posição um é: ${nomes[1]}" echo "O valor guardado na posição dois é: ${nomes[2]}" echo "O valor guardado na posição três é: ${nomes[3]}"
Corremos o script desta forma:
miguel@LUA:~/Scripts/bash$ ./var_arrays_indexados_ex_4.sh O valor guardado na posição zero é: José Miguel O valor guardado na posição um é: Catarina Caldeira O valor guardado na posição dois é: Sara Caldeira O valor guardado na posição três é: João Caldeira
Como podemos ver inicializei as posições do array um a um neste caso todos de seguida, mas podemos inicializar ao longo do script conforme uma determinada posição tenha que guardar um valor.
Ainda existe outra forma de inicializar um array indexado, como é desnecessária para inicializar arrays indexados tornou-se obsoleta. Esta forma usa o comando interno “declare” para declarar uma variável como sendo um array indexado neste caso. É muito pouco usada eu não a uso pois não incrementa valor nenhum aos meus scripts quando uso arrays indexados. Ora vejamos.
declare -a nomes=(Miguel Sara João Catarina)
O comando interno “declare” com a opção “-a” declara o nome “nomes” como sendo um array indexado. Onde os seus valores são acedidos através de um índice, mas para trabalhar com arrays indexados é totalmente desnecessária. No entanto é obrigatória quando se trata de arrays associativos que irei aqui.
Posições de um Array
Existe muitos casos onde necessitamos de saber o número de posições que um array contem. Para que desta forma possamos comparar a fim de saber se o resultado de algum processo foi o esperado ou qualquer outra situação.
A sintaxe que utilizamos para contar o número de posições de um array é a seguinte:
${#nome do array[@]}
Como podemos ver neste caso o nome do array é procedido pelo caractere “#” cardinal. O carácter cardinal antes do nome do array permite que seja retornado o número de posições de um array em vez do seu conteúdo.
No seguinte script exemplifico a utilização deste conceito.
#!/bin/bash # inicializando um array com quatro valores nomes[0]="José Miguel" nomes[2]="Sara Caldeira" nomes[3]="João Caldeira" nomes[1]="Catarina Caldeira" # Escrever o valor guardado em cada posição do array echo "O valor guardado na posição zero é: ${nomes[0]}" echo "O valor guardado na posição um é: ${nomes[1]}" echo "O valor guardado na posição dois é: ${nomes[2]}" echo "O valor guardado na posição três é: ${nomes[3]}" # Escrever o numero de posições do array echo "O array nomes contem ${#nomes[@]} posições"
Executamos o script desta forma:
miguel@LUA:~/Scripts/bash$ ./var_arrays_indexados_ex_5.sh O valor guardado na posição zero é: José Miguel O valor guardado na posição um é: Catarina Caldeira O valor guardado na posição dois é: Sara Caldeira O valor guardado na posição três é: João Caldeira O array nomes contem 4 posições
Conclusão
Trabalhar com arrays indexados é importante na elaboração de scripts. Os arrays são a forma mais segura de guardar vários valores agrupados e referenciados apenas por um único nome.
Perceber bem estes conceitos é importante, pois permite-nos ter uma maior compreensão mais tarde quando os scripts forem mais complexos e usarem estes conceitos.
Experimentar
Para experimentar os scripts descarregue-os e guarde dentro de uma pasta dentro da sua pasta pessoal. Terá que lhes dar permissão de execução a todos eles. veja este exemplo de como fazer, terá que ajustar para o seu utilizador e a pasta onde guardou os scripts.
miguel@LUA:~$ cd Scripts/bash miguel@LUA:~/Scripts/bash$ chmod +x * miguel@LUA:~/Scripts/bash$ ./var_arrays_indexados_ex_1.sh
Duvidas e ideias que queiram discutir sobre BASH podem ser discutidas aqui.
Partilhem, comentem e experimentem!