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