Arrays em Bash

Introdução ao Bash Scripting

Alex Scriven

Data Scientist

O que é um array?

Dois tipos de arrays em Bash:

  • Um array
    • Estrutura "normal" indexada por números.
    • Chamado de "lista" em Python ou "vetor" em R.

Em Python: my_list = [1,3,2,4]

Em R: my_vector <- c(1,3,2,4)

Introdução ao Bash Scripting

Criando um array em Bash

Criar um array indexado por números pode ser feito de duas formas em Bash.

  1. Declarar sem adicionar elementos
declare -a my_first_array
  1. Criar e adicionar elementos ao mesmo tempo
my_first_array=(1 2 3)

Lembre-se: sem espaços ao redor do sinal de igual!

Introdução ao Bash Scripting

Cuidado com as vírgulas!

Vírgulas não são usadas para separar elementos em Bash:

Isto não está correto:

my_first_array=(1, 2, 3)

Isto está correto:

my_first_array=(1 2 3)
Introdução ao Bash Scripting

Propriedades importantes de arrays

  • Todos os elementos podem ser retornados com array[@]. Note que o Bash exige chaves ao redor do nome do array para acessar essas propriedades.
my_array=(1 3 5 2)
echo ${my_array[@]}
1 3 5 2
  • O tamanho de um array é acessado com #array[@]
echo ${#my_array[@]}
4
Introdução ao Bash Scripting

Manipulando elementos do array

Acessando elementos com colchetes.

my_first_array=(15 20 300 42)
echo ${my_first_array[2]}
300
  • Lembre: Bash usa indexação a partir de zero, como Python (mas diferente de R!)
Introdução ao Bash Scripting

Manipulando elementos do array

Defina elementos usando a notação de índice.

my_first_array=(15 20 300 42 23 2 4 33 54 67 66)

my_first_array[0]=999
echo ${my_first_array[0]}
999
  • Lembre-se: não use $ ao sobrescrever um índice, como em $my_first_array[0]=999, pois não funciona.
Introdução ao Bash Scripting

Manipulando elementos do array

Use array[@]:N:M para "fatiar" um subconjunto do array.

  • Aqui N é o índice inicial e M quantos elementos retornar.
my_first_array=(15 20 300 42 23 2 4 33 54 67 66)
echo ${my_first_array[@]:3:2}
42 23
Introdução ao Bash Scripting

Acrescentando a arrays

Adicione ao final com array+=(elements).

Por exemplo:

my_array=(300 42 23 2 4 33 54 67 66)

my_array+=(10) echo ${my_array[@]}
300 42 23 2 4 33 54 67 66 10
Introdução ao Bash Scripting

(Não) acrescentando a arrays

O que acontece se você não colocar parênteses no que quer acrescentar? Vamos ver.

Por exemplo:

my_array=(300 42 23 2 4 33 54 67 66)
my_array+=10
echo ${my_array[@]}
30010 42 23 2 4 33 54 67 66

A string 10 será só anexada ao primeiro elemento. Não é o que queremos!

Introdução ao Bash Scripting

Arrays associativos

  • Um array associativo
    • Parecido com um array normal, mas com pares chave-valor, não índices numéricos
    • Similar ao dicionário do Python ou à lista do R
    • Observação: Só disponível a partir do Bash 4. Alguns Macs modernos têm Bash antigo! Verifique com bash --version no terminal

Em Python:

my_dict = {'city_name': "New York", 'population': 14000000}

Em R:

my_list = list(city_name = c('New York'), population = c(14000000))
Introdução ao Bash Scripting

Criando um array associativo

Você só pode criar um array associativo usando a sintaxe declare (e -A maiúsculo).

Você pode declarar primeiro e depois adicionar elementos, ou fazer tudo em uma linha.

  • Coloque as "chaves" entre colchetes e associe um valor após o igual.
    • Você pode adicionar vários elementos de uma vez.
Introdução ao Bash Scripting

Exemplo de array associativo

Vamos criar um array associativo:

declare -A city_details # Declarar primeiro

city_details=([city_name]="New York" [population]=14000000) # Adicionar elementos
echo ${city_details[city_name]} # Indexar pela chave para retornar o valor
New York
Introdução ao Bash Scripting

Criando um array associativo

Como alternativa, crie e atribua um array associativo em uma linha

  • O restante é igual
declare -A city_details=([city_name]="New York" [population]=14000000)

Acesse as "chaves" de um array associativo com !

echo ${!city_details[@]} # Retorna todas as chaves
city_name population
Introdução ao Bash Scripting

Vamos praticar!

Introdução ao Bash Scripting

Preparing Video For Download...