Aula 6 – Vetores

Aula 5 – Variáveis Especiais | Índice | Aula 7 – Concatenação de Strings


Seu apoio é muito importante para a criação e a manutenção dos cursos gratuitos do canal debxp:


6.1 – Um nome, muitos valores

Como nós já vimos, para criar uma variável no bash/shell, nós escolhemos um nome e atribuímos a ele um valor. Esse valor pode mudar ao longo do tempo enquanto o script é executado, mas o nome sempre representará apenas um valor de cada vez.

:~$ fruta="banana"
:~$ echo $fruta
banana
:~$ fruta="laranja"
:~$ echo $fruta
laranja

E se nós quiséssemos representar, não uma fruta, mas um conjunto de frutas? Uma ideia seria atribuir cada uma das frutas a um nome diferente:

:~$ fruta01="banana"
:~$ fruta02="laranja"
:~$ fruta03="abacate"
:~$ fruta04="goiaba"

Apesar de ser uma solução até intuitiva, isso não seria muito prático, principalmente se quiséssemos percorrer todos os valores correspondentes ao conjunto de “frutas”. Felizmente, porém, o Bash nos permite criar variáveis onde um único nome pode apontar para diversos valores, e esse tipo de varável é chamada de variável vetorial, ou array.

6.2 – Criando vetores indexados

O processo de criação de vetores indexados é tão simples quanto a criação de variáveis escalares. A sintaxe geral é a seguinte:

nome[índice]=valor

Onde nome é o nome da array e índice pode ser um número inteiro positivo ou
uma string. Por exemplo:

fruta[0]="banana"
fruta[1]="laranja"
fruta[2]="abacate"

Ou ainda…

fruta[doce]="banana"
fruta[azeda]="laranja"
fruta[verde]="abacate"

Quando o índice é um número inteiro, nós chamamos esse tipo de variável vetor
indexado
, quando for uma string, nós teremos um vetor associativo.

Especificamente no Bash, uma array indexada pode ser criada da seguinte forma:

fruta=("banana" "laranja" "abacate")

Onde cada valor receberá automaticamente um índice correspondente à sua ordem de ocorrência, sempre contando a partir de 0 (zero).

Finalmente, caso você queira apenas inicializar uma array antes de atribuir qualquer
valor a ela, basta utilizar uma das sintaxes abaixo:

# Arrays indexadas
declare -a nome_da_array

# Arrays associativas
declare -A nome_da_array

Declarar arrays indexadas é opcional, mas declarar arrays associativas é obrigatório.

Por exemplo:

:~$ declare -A fruta
:~$ fruta[verde]=abacate
:~$ fruta[vermelha]=cereja
:~$ fruta[amarela]=banana

Se uma variável associativa não for declarada, ao acessá-la, apenas o valor do último elemento será retornado, pois toda a parte entre colchetes será ignorada no processo de atribuição dos valores.

Exemplo:

:~$ fruta[verde]=abacate
:~$ fruta[vermelha]=cereja
:~$ fruta[amarela]=banana
:~$ echo ${fruta[verde]}
banana

6.3 – Acessando os valores da array

O processo de leitura dos valores em uma array é um pouco diferente do que nós vimos até aqui. Por se tratar de uma identificação composta por um nome e um índice, o shell precisará de algo que indique que estamos falando de todo um conjunto de identificadores, e não apenas de um nome seguindo de uma string.

Veja o exemplo…

:~$ fruta[0]="banana"
:~$ fruta[1]="laranja"
:~$ fruta[2]="abacate"
:~$ echo $fruta
banana
:~$ echo $fruta[2]
banana[2]

Invocando apenas $fruta, o shell retorna somente o valor correspondente ao primeiro elemento da array (banana). Quanto tentamos ser mais específicos fazendo referência ao índice da fruta que nos interessa, $fruta[2], o retorno foi o mesmo de antes acrescido da string [2].

Para que o shell entenda que estamos falando de um nome e um índice, todo esse
conjunto deve estar entre chaves, como na sintaxe geral abaixo:

${nome[índice]}

Aplicando ao exemplo…

:~$ fruta[0]="banana"
:~$ fruta[1]="laranja"
:~$ fruta[2]="abacate"
:~$ echo ${fruta[2]}
abacate

6.4 – Lendo todos os valores de uma array

Nós podemos obter todos os valores de uma array de duas formas: como uma única string ou como strings separadas.

Para obter uma string composta de todos os elementos de uma array, nós utilizamos o caractere asterisco (*) no índice…

:~$ fruta[0]="banana"
:~$ fruta[1]="laranja"
:~$ fruta[2]="abacate"
:~$ echo ${fruta[*]}
banana laranja abacate

Neste caso, banana laranja abacate formam uma única string. Se quisermos obter os mesmos valores, mas como strings separadas, nós utilizamos o caractere arroba (@) no índice…

:~$ fruta[0]="banana"
:~$ fruta[1]="laranja"
:~$ fruta[2]="abacate"
:~$ echo ${fruta[@]}
banana laranja abacate

Embora não seja possível notar na saída do terminal, neste caso estamos diante de três strings distintas, e isso será muito útil quando precisarmos percorrer os valores de uma array, o que nós veremos mais adiante no curso, quando falarmos das estruturas de repetição.

Se, em vez dos valores, nós quisermos os índices de cada elemento, basta acrescentar o caractere de exclamação (!) antes do nome da array:

:~$ fruta[0]="banana"
:~$ fruta[1]="laranja"
:~$ fruta[2]="abacate"
:~$ echo ${!fruta[@]}
0 1 2

6.5 – Listando os valores da array por faixas de índices

É possível listar os valores numa array a partir de um determinado ponto utilizando a sintaxe…

${nome[@]:início}

Onde início é o índice a partir do qual queremos obter a lista de valores.

Por exemplo:

:~$ fruta=("banana" "laranja" "abacate" "limão" "abacaxi")
:~$ echo ${fruta[@]:2}
abacate limão abacaxi

Também é possível obter uma faixa de valores indicando os índices de início e fim:

${nome[@]:início:fim}

Por exemplo…

:~$ fruta=("banana" "laranja" "abacate" "limão" "abacaxi")
:~$ echo ${fruta[@]:1:3}
laranja abacate limão

6.6 – Descobrindo o número de elementos de uma array

Nós podemos descobrir a quantidade de elementos que uma array possui, o que é feito incluindo o caractere cerquilha (#) antes do seu nome, por exemplo…

:~$ fruta[0]="banana"
:~$ fruta[1]="laranja"
:~$ fruta[2]="abacate"
:~$ echo ${#fruta[@]}
3

Aula 5 – Variáveis Especiais | Índice | Aula 7 – Concatenação de Strings

1 Response

  1. Olá Professor, obrigado por disponibilizar suas aulas.
    Eu queria alertá-lo para o erro no link da aula 6 que está apontando para o vídeo da aula 10.
    Grande Abraço.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Post comment