Utilizando arrays em shell script

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

[ Hits: 88.251 ]

 


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

sshpass - Passando senha como parâmetro no SSH e scp sem registro de chave pública

Passagem de parâmetros para funções shell script

Bloqueando Facebook com IPtables (de forma fácil, intuitiva e eficiente)

CGI + Shell Script: gerando listagem de IPs disponíveis em sua rede

tres - Transação Executivo-operacional em Shell

  

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





Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner
Linux banner
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts