Utilizando arrays em shell script

Publicado por Vinícius Parizatto em 28/03/2006

[ Hits: 121.195 ]

 


Utilizando arrays em shell script



Em um dos meus trabalhos em Shell Script precisei alocar informações consecutivas referentes a um conjunto de dados semelhantes. A solução foi utilizar arrays.

Esta dica tem como objetivo ensinar a trabalhar com eles em Shell Script (bash e ksh).

O que é um array?


Array é uma estrutura de dados que consiste em itens relacionados entre si. É um grupo de valores alocados em um único elemento declarado. A referência é feita a uma posição em particular.

Além disso, no caso do shell BASH ele possibilita o uso por blocos de elementos.

Declaração


Um array pode ser declarado como lista de elementos de uma só vez.

Existe uma diferença na forma de como declarar esta lista no BASH e o KSH.

Declaração de uma lista em BASH:

nomes=( "Bit" "Nibble" "Byte" "Word" "Double Word")

Declaração de uma lista em KSH:

set -A nomes "Bit" "Nibble" "Byte" "Word" "Double Word"

Ele também pode ser declarado elemento a elemento que é uma prática em comum aos dois shells respectivos.

Declaração elemento a elemento:

nomes[0]="Bit"
nomes[1]="Nibble"
nomes[2]="Byte"
nomes[3]="Word"
nomes[4]="Double Word"

Referência


Para fazer referência e obter o elemento que está dentro do array, você deverá usar a declaração "${}" , comum entre o BASH e o KSH.

Referência de um elemento ou uma posição em um array:

${nomes[2]}

Retornará:

"Byte"

O shell BASH, além de indicar um elemento, nos possibilita a declaração de um bloco contido em um array. Isso pode ser feito da seguinte forma:

Referência com posição inicial:

${nomes[@]:2}

Esta mostra o elemento da posição 2 até fim do array. No caso irá retornar:

"Byte" "Word" "Double Word"

Referência com posição inicial e final:

${nomes[@]:1:2}

Esta exibe os elementos com início na posição 1 seguidos de mais dois elementos consecutivos à posição 1. O comando acima retornará:

"Nibble" "Byte" "Word"

A referência ao número de elementos alocados em um array é comum aos dois shells sendo declarada da seguinte forma:

${#nomes[@]}

Isso retornará:

5

Prática


Abaixo dois exemplos práticos de como pode ser usado arrays em um script utilizando KSH e BASH.

#!/bin/ksh
#-----------------------------------------------------
#  Arquivo:       arrayEx.ksh
#  Descricao:     Exemplo de utilizacao de arrays
#                 em Korn Shell
#  Autor:         Vinícius Parizatto
#----------------------------------------------------

set -A nomes "Bit" "Nibble" "Byte" "Word" "Double Word"
set -A valores 1 4 8 16 32
x=0;
echo 
"########################################"
while [ $x != ${#nomes[@]} ]
do
   if [ $x == 0 ]
   then
      echo "A menor \"unidade\" de dados binários "
      echo "tem o nome de "${nomes[$x]}"."
      echo "Ele representa "${valores[$x]}" único digito"
      echo ""
   else
      echo "* "${nomes[$x]}" é o conjunto de "${valores[$x]}" bits."
   fi
   let "x = x +1"
done
echo "########################################"

#!/bin/bash
#-----------------------------------------------------
#  Arquivo:       arrayEx.bash
# Descricao: Exemplo de utilizacao de arrays # em GNU Bourne-Again SHell
# Autor: Vinícius Parizatto
#----------------------------------------------------


nomes=( "Bit" "Nibble" "Byte" "Word" "Double Word") valores=( 1 4 8 16 32) x=0; echo "########################################" while [ $x != ${#nomes[@]} ] do if [ $x == 0 ] then echo "A menor \"unidade\" de dados binários " echo "tem o nome de "${nomes[$x]}"." echo "Ele representa "${valores[$x]}" único digito" echo "" else echo "1 "${nomes[$x]}" é o conjunto de "${valores[$x]}" bits." fi let "x = x +1" done echo "("${nomes[@]:2}")" echo "são os conjuntos de bits" echo "("${nomes[@]:1:3}")" echo "são os conjuntos menores que 32 bits" echo "########################################"

Obs.: o /bin/bash é o local padrão para o BASH no Linux. No NetBSD o local padrão é /usr/pkg/bin/bash, no OpenBSD em /usr/local/bin/bash e no OpenSolaris em /usr/bin/bash, quando instalado.

Espero que esta dica acrescente boas práticas em desenvolvimento de Shell Script.

Outras dicas deste autor
Nenhuma dica encontrada.
Leitura recomendada

Curso de Shell Script Avançado

Sockets em shell script

Adicionando serviço ao ntsysv no Red Hat 9

Usando find para expandir listas de arquivos em argumentos de modo seguro

Modem USB Giant D301 - GSM/3G no Ubuntu 8.04

  

Comentários
[1] Comentário enviado por removido em 09/07/2006 - 14:41h

opa, boa tarde, vc sabe me informar como eu poderia fazer em shellscript o seguinte ou pelo menos me dar a dica do caminho a seguir.

if "palavra abc" estiver contido dentro da "lista.txt"; executa os comandos

[2] Comentário enviado por jamielniak em 02/03/2007 - 20:55h

acho que isso resolve o problema do icarooo

if(`cat lista.txt | grep "palavra abc" > /dev/null`)
then
<lista de comandos>
fi

[3] Comentário enviado por chmod000 em 29/03/2007 - 09:30h

Gostei da dica, Vinicius.

complemento com o seguinte:
Um array pode ser gerado pegando dados de um arquivo da seguinte forma:

#!/bin/bash

#cada palavra do arquivo vira um elemento do array

array=( ${array[@]} `cat arquivo.txt` )

# agora vamos exibir o conteúdo
for palavra in ${array[@]}; do
echo $palavra
done



[4] Comentário enviado por hal0x9k em 05/12/2022 - 16:59h

Olá, Vinícius.

Muito boa a sua abordagem sobre o tema.
Permita-me contribuir com o seu exemplo prático:

Em vez de utilizar uma variável incremental ( let "x = x +1" ) até chegar no upper bound do array e o "while" como estrutura de loop, poderia-se usar o "for" que nativamente percorrerá o array e a variável será incrementada automaticamente, se ao acioná-lo, colocar uma exclamação na chamada do array:

for x in "${!nomes[@]}"
do
if [ $x == 0 ]
then
echo "A menor \"unidade\" de dados binários "
echo "tem o nome de "${nomes[$x]}"."
echo "Ele representa "${valores[$x]}" único digito"
echo ""
else
echo "1 "${nomes[$x]}" é o conjunto de "${valores[$x]}" bits."
fi
done


Neste caso em particular, a bang "!" foi necessária pois o código está validando o índice do array. Mas caso fosse uma listagem comum, poderia ser usada uma sintaxe simplificada e atribuir os itens do array diretamente na variável:


valores=( 1 4 8 16 32)
x=0;

echo "##########################################"
echo "São conjutos de bits:"
for x in "${valores[@]}"
do
if [ $x -gt 1 ]
then
echo "$x bytes"
fi
done
echo "##########################################"




Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts