Matrizes Bash

Aqui está uma tradução de " Bash Arrays " de Mitch Frazier em linuxjournal.com.



Se você estiver usando o shell NIX "padrão" *, pode não estar familiarizado com o útil recurso bash dos arrays. Embora os arrays no bash não sejam tão legais quanto nas linguagens P (Perl, Python e PHP) e outras linguagens de programação, eles costumam ser úteis.

As matrizes Bash têm apenas índices numéricos, mas são opcionais, o que significa que você não precisa definir explicitamente os valores de todos os índices. Uma matriz inteira pode ser definida colocando as entradas entre parênteses:



  arr=(Hello World)


Os registros individuais podem ser definidos usando a sintaxe familiar (de BASIC (perdoe-me Dijkstra - nota do tradutor) para Fortran):



  arr[0]=Hello
  arr[1]=World




No entanto, o oposto parece comparativamente mais feio. Se você precisar se referir a uma entrada específica, então:



  echo ${arr[0]} ${arr[1]}


Na página de manual:



" Chaves onduladas são necessárias para evitar conflitos ao expandir caminhos completos para arquivos. "



Além disso, as seguintes construções estranhas estão disponíveis:



  ${arr[*]} #    
  ${!arr[*]}#    
  ${#arr[*]}#    
  ${#arr[0]}#    (  )


$ {! arr [*]} é uma adição relativamente nova ao bash e não faz parte da implementação original. A construção a seguir mostra um exemplo de uso simples de um array. Observe o "[índice] = valor", isso permite que você atribua um valor específico a um número de registro específico.



#!/bin/bash

array=(one two three four [5]=five)

echo "Array size: ${#array[*]}"  #   

echo "Array items:" #   
for item in ${array[*]}
do
    printf "   %s\n" $item
done

echo "Array indexes:" #   
for index in ${!array[*]}
do
    printf "   %d\n" $index
done

echo "Array items and indexes:" #      
for index in ${!array[*]}
do
    printf "%4d: %s\n" $index ${array[$index]}
done


A execução do script gerará a seguinte saída:



Tamanho do array: 5



itens do array:



um

dois

três

quatro

cinco



Índices do array:



0

1

2

3

5



Array itens e índices:



0: um

1: dois

2: três

3: quatro

5: cinco



Observe que o caractere "@" pode ser usado em vez de "*" em construções como {arr [*]}, o resultado será o mesmo, exceto para a expansão da entrada entre aspas. "$ *" e "$ @" produzirão entradas entre aspas, "$ {arr [*]}" retornará cada entrada como uma palavra, "$ {arr [@]}" retornará cada entrada como palavras separadas.



O exemplo a seguir mostrará como aspas e construções sem aspas retornam strings (especialmente importante quando essas strings contêm espaços):



#!/bin/bash

array=("first item" "second item" "third" "item")

echo "Number of items in original array: ${#array[*]}"
for ix in ${!array[*]}
do
    printf "   %s\n" "${array[$ix]}"
done
echo

arr=(${array[*]})
echo "After unquoted expansion: ${#arr[*]}"
for ix in ${!arr[*]}
do
    printf "   %s\n" "${arr[$ix]}"
done
echo

arr=("${array[*]}")
echo "After * quoted expansion: ${#arr[*]}"
for ix in ${!arr[*]}
do
    printf "   %s\n" "${arr[$ix]}"
done
echo

arr=("${array[@]}")
echo "After @ quoted expansion: ${#arr[*]}"
for ix in ${!arr[*]}
do
    printf "   %s\n" "${arr[$ix]}"
done


Saída na inicialização:



Número de itens na matriz original: 4



primeiro item,

segundo item,

terceiro

item



Após expansão sem aspas : 6



primeiro

item,

segundo

item,

terceiro

item



Após * expansão citada: 1



primeiro item, segundo item, terceiro item,



Após @ expansão entre aspas: 4



primeiro item,

segundo item

terceiro

item



All Articles