Matrizes Bash em profundidade

Matrizes Bash em profundidade
Em Bash, uma matriz pode ser uma matriz indexada ou uma matriz associativa. Uma matriz indexada é uma lista cujos itens são numerados a partir de zero. Uma matriz associativa é uma lista em que as cordas substituíram os números. Suponha uma caneta, um livro de exercícios, um livro, um governante, US $ 42 e um lápis em uma mesa de estudo. Esses 6 itens podem ser escritos como uma lista, como segue:
  1. caneta
  2. livro de exercícios
  3. livro didático
  4. governante
  5. 42
  6. lápis

Este é um exemplo de uma matriz indexada. Existem 6 itens, mas os itens foram numerados de zero a 5. Numerar dessa maneira está indexando. A contagem de índice em Bash começa de zero e não 1.

Cada um desses produtos é fabricado a partir de algum material principal. Uma lista do material principal, seguida pelo seu produto acabado, é:

tinta => caneta
papel macio => Livro de exercícios
Papel hard => Livro didático
plástico => régua
papel especial => 42
madeira => lápis

Este é um exemplo de uma matriz associativa. Não basta apenas digitar essas matrizes em um arquivo de bash. Qualquer um dos diferentes tipos de matrizes deve ser codificado. A codificação de uma matriz indexada é semelhante à codificação de uma matriz associativa. No entanto, existem diferenças pequenas, mas importantes. Este artigo dá uma análise aprofundada em matrizes de festas.

Conteúdo do artigo

  • Matriz indexada
  • Matriz associativa
  • Conclusão

Matriz indexada

Criando uma matriz indexada

Uma maneira de criar a matriz indicada acima é a seguinte:

arr = (Livro de exercícios '"Livro de Exercício" Ré lápis 42)

Aqui, arr é o nome da matriz. O programador poderia ter dado algum outro nome. Espaços separam os diferentes itens na lista de matrizes. Se um item consistir em mais de uma palavra, ele será digitado em cantetas únicas ou duplas. O índice para a caneta é 0; O índice de 'Livro de Exercícios' é 1; O índice de "livro didático" é 2; O índice para governante é 3; O índice para 42 é 4; O índice para lápis é 5.

Outra maneira de criar a matriz acima começa da seguinte maneira:

arr [2] = "Livro"

Isto é, a matriz é criada, começando com qualquer item da lista. '2' entre colchetes é conhecido como um subscrito. Os outros elementos podem ser incluídos mais tarde, como segue:

arr [0] = caneta
arr [1] = 'Livro de exercícios'
arr [3] = governante
arr [4] = 42
arr [5] = lápis

Observe que na inclusão, o item do índice 2 não foi repetido.

Outra maneira de criar a matriz acima é a seguinte:

declarar -a arr

Aqui, "declarar" é uma palavra reservada. '-a' significa matriz indexada. "ARR" é o nome da escolha do programador. Todos os elementos podem ser incluídos da seguinte forma:

arr [0] = caneta
arr [1] = 'Livro de exercícios'
arr [2] = "Livro"
arr [3] = governante
arr [4] = 42
arr [5] = lápis

Isso é inclusão por atribuição. Lembre -se, quando qualquer valor é atribuído a uma variável, não deve haver espaço entre o operador de atribuição, = e a variável ou o valor.

Referência ao elemento indexado

A sintaxe para referência a um elemento é:

$ nome [subscrito]

Onde o nome é o nome da matriz, como o ARR. Subscrito é um número inteiro (número).

Índices positivos

A contagem de índice normalmente começa de zero. No código a seguir, os valores dos elementos são lidos e exibidos:

arr = (Livro de exercícios '"Livro de Exercício" Ré lápis 42)
para ((i = 0; i < 6; ++i)); do
eco $ arr [i]
feito

A saída é:

caneta
livro de exercícios
livro didático
governante
42
lápis

Seis elementos estão começando do índice zero ao índice 5. Então, a iteração é feita 6 vezes e não 5 vezes.

Índices negativos

Índices negativos podem ser usados ​​para acessar elementos. Nesse caso, -1 refere -se ao último elemento; -2 refere-se ao último elemento, mas um; -3 refere-se ao elemento antes do último elemento, mas assim. Então, para a matriz acima, -6 refere -se ao primeiro elemento. O código a seguir ilustra o seguinte:

arr = (Livro de exercícios '"Livro de Exercício" Ré lápis 42)
para ((i = -1; i> = -6; --i)); fazer
eco $ arr [i]
feito

A saída é:

lápis
42
governante
livro didático
livro de exercícios
caneta

A tela está em ordem inversa.

Exibindo todos os elementos na matriz indexada

Para exibir todos os elementos, $ name [*] ou $ name [@] pode ser usado. Nessas expressões, * ou @ está no lugar do índice. E com isso, em vez de retornar os valores dos elementos, os valores dos elementos presentes na matriz são retornados. O código a seguir ilustra o seguinte:

declarar -a arr
arr [1] = 'Livro de exercícios' arr [3] = governante arr [5] = lápis
echo $ arr [@]
eco $ arr [*]

A saída é,
Livro do Livro do Exercício Lápis
Livro do Livro do Exercício Lápis

Observe que @ e * usados ​​dessa maneira são sinônimos. Há um problema com a saída: as frases são separadas por espaços e não podem ser distinguidas. O código a seguir deve separar as frases com vírgulas:

declarar -a arr
arr [1] = 'Livro de exercícios' arr [3] = governante arr [5] = lápis
Ifs =,
eco "$ arr [@]"
eco "$ arr [*]"

A saída é agora:

Livro do Livro do Exercício Lápis
Livro de exercícios, governante, lápis

IFS significa separador de campo interno. Foi atribuído uma vírgula. Observe o uso de citações duplas para $ arr [@] e $ arr [*] nos comandos echo. Vírgulas foram incluídas para o subscrito * e não para o subscrito @. Ainda há outro problema: na segunda linha de saída, onde as vírgulas foram empregadas, os espaços não foram exibidos. Então, @ e * não são sinônimos o tempo todo. No entanto, é possível se separar com vírgula e espaço - veja abaixo.

Exibindo índices de matriz indexada

A expressão, $ !nome [@] ou $ !nome [*] retorna os índices de uma matriz como uma lista, separados por espaços. Observe o uso e a posição do sinal de exclamação (!). O código a seguir mostra o uso dessas expressões:

arr [1] = 'Livro de exercícios' arr [3] = governante arr [5] = lápis
eco $ !arr [@]
eco $ !arr [*]

A saída é:
1 3 5
1 3 5

Comprimento da matriz indexada

A duração da matriz é dada por:

$ #nome [subscrito]

Onde o nome é o nome como o ARR, que o programador deu à matriz; O subscrito é o maior índice (comprimento - 1) para o elemento cujo valor é definido. Observe o uso e a posição do símbolo, #. O código a seguir ilustra o seguinte:

arr = (Livro de exercícios '"Livro de Exercício" Ré lápis 42)
eco $ #arr [5]

A saída é 6. Mesmo que alguns ou todos os elementos inferiores não estejam presentes, o comprimento ainda seria mais alto_index + 1. O código a seguir ilustra o seguinte:

declarar -a arr
arr [3] = governante
arr [5] = lápis
eco $ #arr [5]

A saída ainda é 6, mesmo que nenhum elemento exista, para índice 0, índice 1, índice 2 e índice 4.

Número de elementos da matriz indexada

Como visto acima, o número de elementos na matriz pode ser menor que o comprimento da matriz. Isso ocorre porque os valores de alguns elementos abaixo do último elemento não foram criados ou não foram. A expressão fornece o número de elementos definidos em uma matriz indexada, $ #arr [@] ou $ #arr [*], conforme mostrado no código a seguir:

arr [1] = 'Livro de exercícios' arr [3] = governante arr [5] = lápis
echo $ #arr [@]
eco $ #arr [*]

A saída é:

3
3

Exibindo apenas elementos de conjunto de matrizes indexados

Um elemento de índice atribuído a um valor é definido, enquanto o que não é atribuído um valor não é definido. O código a seguir exibe apenas os valores definidos:

arr [1] = 'Livro de exercícios' arr [3] = governante arr [5] = lápis
para ((i = 0; i < $#arr[5]; ++i)); do
se [ ! -z "$ arr [i]"]; então
printf "$ arr [i],"
fi
feito
eco

A saída é:

Livro de exercícios, governante, lápis,

Observe como os elementos não definidos foram identificados e eliminados da iteração na condição. Observe também que, na condição, $ arr [i] está em citações duplas como "$ arr [i]", para que os valores que contêm espaços possam ser impressos. O comando printf é semelhante ao comando echo, mas não adiciona uma nova linha após a exibição. Foi possível separar os valores na saída, com vírgula e espaço, em uma linha. O último eco faria com que a próxima saída fosse para a próxima linha.

Uma forma mais simples do código acima é a seguinte:

arr [1] = 'Livro de exercícios' arr [3] = governante arr [5] = lápis
para eu em $ !arr [@]; fazer
printf "$ arr [i],"
feito
eco

A saída é a mesma. Observe a expressão da lista após a palavra reservada, em. Esta expressão retorna a lista de índices. Portanto, não há necessidade da Condição IF aqui.

Definir e desarmar elementos indexados e sua matriz

Qualquer elemento indexado que não tenha sido atribuído a um valor não. Um elemento indexado que tem um valor atribuído a ele é definido. Agora, um elemento pode ser intencionalmente não definido, como mostra o script a seguir:

arr [1] = 'Livro de exercícios' arr [3] = governante arr [5] = lápis
Unset ARR [3]
para eu em $ !arr [@]; fazer
printf "$ arr [i],"
feito
eco

A saída é:

Livro de exercícios, lápis,

"Governante" não foi exibido. A sintaxe para despertar um elemento é:

Unset ArrayName [Subscript]

A sintaxe para remover ou desativar toda a matriz é:

Unset ArrayName

ou

Unset ArrayName [@]

ou

Unset ArrayName [*]

No código a seguir, toda a matriz não é definida:

arr = (Livro de exercícios '"Livro de Exercício" Ré lápis 42)
Unset arr
eco "$ arr [*]"

A saída não é nada (uma linha vazia) porque toda.

Matriz associativa

Conforme indicado acima, um exemplo de uma matriz associativa escrita em papel é:

tinta => caneta
papel macio => Livro de exercícios
papel hard => livro de texto
plástico => régua
papel especial => 42
madeira => lápis

Existem 6 elementos, cada um consistindo em um par de chaves/valor. Para o primeiro elemento, "Ink" é a chave e "caneta" é o valor; Para o segundo elemento, "Paper Soft" é a chave e "Livro de Exercício" é o valor; e assim por diante.

Criando uma matriz associativa

Uma maneira de criar a matriz acima é a seguinte:

declarar -a arr = ([tinta] = caneta [papel mole] = 'Livro de exercícios' [papel duro] = "livro de texto" [plástico] = régua [papel especial] = 42 [madeira] = lápis)

Aqui, arr é o nome da matriz. O programador poderia ter dado algum outro nome. Espaços separam os diferentes elementos na lista de matrizes. Se um valor consiste em mais de uma palavra, ele é digitado em uma única ou dupla-cita. Uma chave pode consistir em mais de uma palavra. Existem 6 pares de chave/valor nesta matriz associativa codificada. Uma chave é colocada entre colchetes. O valor é atribuído à chave, com o operador de atribuição. '-A' significa matriz associativa, e deve estar lá.

Outra maneira de criar a matriz acima começa da seguinte maneira:

declarar -a arr

Aqui, "declarar" é uma palavra reservada. '-A' significa matriz associativa (enquanto '-a' significa matriz indexada). "ARR" é o nome da escolha do programador. Os elementos podem ser incluídos da seguinte forma:

declarar -a arr
arr [papel macio] = 'Livro de exercícios'
arr [plástico] = régua
arr [madeira] = lápis

Todos os elementos (6) não devem ser necessariamente incluídos ao mesmo tempo. O resto pode ser adicionado mais tarde. Isso está adicionando por atribuição. Lembre -se, quando qualquer valor é atribuído a uma variável, não deve haver espaço entre o operador de atribuição, = e a variável ou o valor.

Referência ao elemento de matriz associativa

A sintaxe para fazer referência a um elemento de matriz associativa é:

$ nome [subscrito]

Onde o nome é o nome da matriz, como o ARR. Subscrito é a chave no formulário de texto. No código a seguir, os valores dos elementos são lidos e exibidos:

declarar -a arr = ([tinta] = caneta [papel mole] = 'Livro de exercícios' [papel duro] = "Livro" [plástico] = régua [papel especial] = 42 [madeira] = lápis)
eco $ arr [tinta]
eco $ arr [papel mole]
eco $ arr [papel hard]
eco $ arr [plástico]
eco $ arr [artigo especial]
eco $ arr [madeira]

A saída é:

caneta
livro de exercícios
livro didático
governante
42
lápis

Exibindo todos os valores na matriz associativa

Para exibir todos os valores, $ name [*] ou $ name [@] pode ser usado. Nessas expressões, * ou @ está no lugar da chave. E com isso, em vez de retornar os valores dos elementos, os valores dos elementos presentes na matriz são retornados. O código a seguir ilustra o seguinte:

declarar -a arr
arr [papel macio] = 'Livro de exercícios' arr [plástico] = régua arr [madeira] = lápis
echo $ arr [@]
eco $ arr [*]

A saída é,

Revestimento do Livro de Exercícios de Lápis
Revestimento do Livro de Exercícios de Lápis

A ordem dos valores na saída não precisa corresponder à ordem na matriz associativa. Observe que @ e * usados ​​dessa maneira são sinônimos. Há um problema com a saída: as frases são separadas por espaços e não podem ser distinguidas. O código a seguir separa as frases com vírgulas:

declarar -a arr
arr [papel macio] = 'Livro de exercícios' arr [plástico] = régua arr [madeira] = lápis
Ifs =,
eco "$ arr [@]"
eco "$ arr [*]"

A saída é agora:

Revestimento do Livro de Exercícios de Lápis
Lápis, livro de exercícios, governante

IFS significa separador de campo interno. Foi atribuído uma vírgula. Observe o uso de citações duplas para $ arr [@] e $ arr [*] nos comandos echo. Vírgulas foram incluídas para o subscrito * e não para o subscrito @. Ainda há outro problema: na segunda linha de saída, onde as vírgulas foram empregadas, os espaços não foram exibidos. Então, @ e * não são sinônimos o tempo todo. Bem, é possível se separar com vírgula e espaço - veja abaixo.

Exibindo todas as chaves da matriz associativa

A expressão, $ !nome [@] ou $ !nome [*] retorna as chaves de uma matriz como uma lista, separadas por espaços. Observe o uso e a posição do sinal de exclamação (!). O código a seguir mostra o uso dessas expressões:

declarar -a arr
arr [papel macio] = 'Livro de exercícios' arr [plástico] = régua arr [madeira] = lápis
eco $ !arr [@]
eco $ !arr [*]

A saída é:

plástico de papel macio de madeira
plástico de papel macio de madeira

A ordem das chaves da matriz associativa não precisa ser a mesma declarada na matriz.

Número de elementos de matriz associativa

A expressão fornece o número de elementos definidos em uma matriz associativa, $ #arr [@] ou $ #arr [*], conforme mostrado no código a seguir:

declarar -a arr
arr [papel macio] = 'Livro de exercícios' arr [plástico] = régua arr [madeira] = lápis
echo $ #arr [@]
eco $ #arr [*]

A saída é:

3
3

Observe o uso e a posição do símbolo, #.

Exibindo apenas elementos de conjunto de matrizes associativas

Um elemento -chave atribuído a um valor é definido, enquanto o que não é atribuído um valor não é definido. O código a seguir exibe apenas os valores definidos:

declarar -a arr
arr [tinta] = caneta
$ arr [papel mole]; arr [papel macio] = 'Livro de exercícios'
$ arr [papel duro]
arr [plástico] = régua
$ arr [artigo especial]
arr [madeira] = lápis
Para chave em "$ !arr [@] "; faça
printf "$ arr [$ key],"
feito
eco

A saída é:

Lápis, livro de exercícios, caneta, governante,

Novamente, o posicionamento de saída não está na ordem que foi codificada. Observe que “$ !Arr [@] ”está em citações duplas para que os valores que contêm espaços possam ser impressos. Observe que em $ arr [$ key], a chave é precedida por $. O comando printf é semelhante ao comando echo, mas não adiciona uma nova linha após a exibição. Foi possível separar os valores na saída, com vírgula e espaço, em uma linha. O último eco faria com que a próxima saída fosse para a próxima linha.

Definir e desativar elementos de matriz associativa e sua matriz

Qualquer elemento -chave que não tenha sido atribuído a um valor não. Um elemento -chave que tem um valor atribuído a ele é definido. Agora, um elemento pode ser intencionalmente não definido, como mostra o script a seguir:

declarar -a arr
arr [papel macio] = 'Livro de exercícios' arr [plástico] = régua arr [madeira] = lápis
Unset arr [plástico]
Para chave em "$ !arr [@] "; faça
printf "$ arr [$ key],"
feito
eco

A saída é:

Lápis, livro de exercícios,

"Governante" não foi exibido. A sintaxe para despertar um elemento é:

Unset ArrayName [Key]

A sintaxe para remover ou desativar toda a matriz associativa é:

Unset ArrayName

ou

Unset ArrayName [@]

ou

Unset ArrayName [*]

No código a seguir, toda a matriz não é definida:

declarar -a arr = ([tinta] = caneta [papel mole] = 'Livro de exercícios' [papel duro] = "livro de texto" [plástico] = régua [papel especial] = 42 [madeira] = lápis)
Unset arr
eco "$ arr [*]"

A saída não é nada (uma linha vazia) porque toda a matriz não foi definida.

Exibindo os valores de uma matriz associada

Exibindo os valores de uma matriz associada

declarar -a arr = ([tinta] = caneta [papel mole] = 'Livro de exercícios' [papel duro] = "livro de texto" [plástico] = régua [papel especial] = 42 [madeira] = lápis)
para valor em "$ arr [@]"; fazer
eco $ valor
feito

A saída é:

lápis
42
livro de exercícios
livro didático
caneta
governante

Novamente, a ordem em que os valores são codificados em uma matriz associativa não precisa ser a ordem em que são exibidos. Observe que @ foi usado em vez de * para a variável da lista. Além disso, citações duplas foram usadas para a variável da lista.

Conclusão

Uma matriz é uma lista, numerada ou com chave. Quando a matriz é numerada, é uma matriz indexada. Quando os valores estão localizados por chaves, é uma matriz associativa. Com a matriz indexada, a numeração começa de zero. Na computação, a matriz deve ser codificada. O programador precisa saber como criar a matriz. Ele precisa saber como adicionar elementos à matriz e excluir elementos da matriz. Ele precisa ser capaz de determinar o número de elementos na matriz. E ele precisa saber como excluir a matriz.