Matrices bash en profundidad

Matrices bash en profundidad
En Bash, una matriz puede ser una matriz indexada o una matriz asociativa. Una matriz indexada es una lista cuyos elementos están numerados a partir de cero. Una matriz asociativa es una lista donde las cadenas han reemplazado los números. Suponga un bolígrafo, un libro de ejercicios, un libro de texto, una regla, $ 42 y un lápiz en una mesa de estudio. Estos 6 elementos se pueden escribir como una lista, como sigue:
  1. bolígrafo
  2. libro de ejercicios
  3. libro de texto
  4. gobernante
  5. 42
  6. lápiz

Este es un ejemplo de una matriz indexada. Hay 6 elementos, pero los elementos han sido numerados de cero a 5. Numerar de esta manera está indexando. El conteo de índice en Bash comienza desde cero y no 1.

Cada uno de estos productos se fabrica a partir de algún material principal. Una lista del material principal, seguido de su producto terminado, es:

tinta => bolígrafo
papel suave => libro de ejercicios
papel duro => libro de texto
plástico => regla
papel especial => 42
madera => lápiz

Este es un ejemplo de una matriz asociativa. No es suficiente escribir estas matrices en un archivo bash. Cualquiera de los diferentes tipos de matrices debe codificarse. La codificación de una matriz indexada es similar a la codificación de una matriz asociativa. Sin embargo, hay pequeñas pero importantes diferencias. Este artículo da una mirada en profundidad a las matrices de bash.

Contenido del artículo

  • Matriz indexada
  • Matriz asociativa
  • Conclusión

Matriz indexada

Creando una matriz indexada

Una forma de crear la matriz indicada anteriormente es la siguiente:

arr = (Pen 'Libro de ejercicios' "Libro de texto" Regla 42 lápiz)

Aquí, arr es el nombre de la matriz. El programador podría haber dado algún otro nombre. Los espacios separan los diferentes elementos en la lista de matrices. Si un elemento consta de más de una palabra, se escribe en cotizaciones simples o dobles. El índice para la pluma es 0; El índice 'Libro de ejercicios' es 1; El índice para el "libro de texto" es 2; El índice para la regla es 3; El índice para 42 es 4; El índice de lápiz es de 5.

Otra forma de crear la matriz anterior comienza de la siguiente manera:

arr [2] = "libro de texto"

Es decir, se crea la matriz, comenzando con cualquier elemento en la lista. '2' en los soportes cuadrados se conoce como subíndice. Los otros elementos se pueden incluir más adelante, como sigue:

arr [0] = Pen
arr [1] = 'Libro de ejercicios'
arr [3] = regla
arr [4] = 42
arr [5] = lápiz

Tenga en cuenta que en la inclusión, el elemento del índice 2 no se ha repetido.

Otra forma de crear la matriz anterior es la siguiente:

declarar -A arr

Aquí, "Declarar" es una palabra reservada. '-a' significa matriz indexada. "ARR" es el nombre de la elección del programador. Todos los elementos se pueden incluir de la siguiente manera:

arr [0] = Pen
arr [1] = 'Libro de ejercicios'
arr [2] = "libro de texto"
arr [3] = regla
arr [4] = 42
arr [5] = lápiz

Esta es la inclusión por asignación. Recuerde, cuando se asigna cualquier valor a una variable, no debe haber espacio entre el operador de asignación, = y la variable o el valor.

Referencia al elemento indexado

La sintaxis para hacer referencia a un elemento es:

$ nombre [subíndice]

Donde el nombre es el nombre de la matriz, como arr. El subíndice es un entero (número).

Índices positivos

El conteo de índice normalmente comienza desde cero. En el siguiente código, los valores de los elementos se leen y se muestran:

arr = (Pen 'Libro de ejercicios' "Libro de texto" Regla 42 lápiz)
para ((i = 0; i < 6; ++i)); do
echo $ arr [i]
hecho

La salida es:

bolígrafo
libro de ejercicios
libro de texto
gobernante
42
lápiz

Seis elementos comienzan desde el índice cero al índice 5. Entonces, la iteración se realiza 6 veces y no 5 veces.

Índices negativos

Se pueden usar índices negativos para acceder a elementos. En este caso, -1 se refiere al último elemento; -2 se refiere al último pero un elemento; -3 se refiere al elemento antes del elemento de último pero uno, y así sucesivamente. Entonces, para la matriz anterior, -6 se refiere al primer elemento. El siguiente código ilustra esto:

arr = (Pen 'Libro de ejercicios' "Libro de texto" Regla 42 lápiz)
para ((i = -1; i> = -6; --i)); hacer
echo $ arr [i]
hecho

La salida es:

lápiz
42
gobernante
libro de texto
libro de ejercicios
bolígrafo

La pantalla está en orden inverso.

Mostrar todos los elementos en una matriz indexada

Para mostrar todos los elementos, $ nombre [*] o $ nombre [@] se puede usar. En estas expresiones, * o @ está en lugar del índice. Y con eso, en lugar de devolver los valores de los elementos, los valores de los elementos presentes en la matriz se devuelven. El siguiente código ilustra esto:

declarar -A arr
arr [1] = 'Libro de ejercicios' arr [3] = regla arr [5] = lápiz
echo $ arr [@]
echo $ arr [*]

La salida es,
lápiz de regla del libro de ejercicios
lápiz de regla del libro de ejercicios

Observe que @ y * utilizados de esta manera son sinónimos. Hay un problema con la salida: las frases están separadas por espacios y no se pueden distinguir. El siguiente código debe separar las frases con comas:

declarar -A arr
arr [1] = 'Libro de ejercicios' arr [3] = regla arr [5] = lápiz
Ifs =,
echo "$ arr [@]"
echo "$ arr [*]"

La salida es ahora:

lápiz de regla del libro de ejercicios
Libro de ejercicios, regla, lápiz

IFS significa separador de campo interno. Se le ha asignado una coma. Tenga en cuenta el uso de cotizaciones dobles para $ arr [@] y $ arr [*] en los comandos de eco. Se han incluido comas para el subíndice * y no para el subíndice @. Todavía hay otro problema: en la segunda línea de salida, donde se han empleado comas, no se han mostrado espacios. Entonces, @ y * no son sinónimos todo el tiempo. Sin embargo, es posible separarse con coma y espacio; ver a continuación.

Mostrar índices de matriz indexada

La expresión, $ !nombre [@] o $ !Nombre [*] Devuelve los índices de una matriz como una lista, separada por espacios. Tenga en cuenta el uso y la posición del signo de exclamación (!). El siguiente código muestra el uso de estas expresiones:

arr [1] = 'Libro de ejercicios' arr [3] = regla arr [5] = lápiz
Echo $ !arr [@]
Echo $ !arr [*]

La salida es:
1 3 5
1 3 5

Longitud de la matriz indexada

La longitud de la matriz está dada por:

$ #name [subíndice]

Donde el nombre es el nombre como ARR, que el programador dio a la matriz; El subíndice es el índice más alto (longitud - 1) para el elemento cuyo valor está establecido. Tenga en cuenta el uso y la posición del símbolo, #. El siguiente código ilustra esto:

arr = (Pen 'Libro de ejercicios' "Libro de texto" Regla 42 lápiz)
echo $ #arr [5]

La salida es 6. Incluso si algunos o todos los elementos inferiores no están presentes, la longitud aún sería más alta_index + 1. El siguiente código ilustra esto:

declarar -A arr
arr [3] = regla
arr [5] = lápiz
echo $ #arr [5]

La salida sigue siendo 6, aunque no hay elemento, para el índice 0, índice 1, índice 2 e índice 4.

Número de elementos de matriz indexada

Como se vio anteriormente, el número de elementos en la matriz puede ser menor que la longitud de la matriz. Esto se debe a que los valores de algunos elementos debajo del último elemento no se han creado o no han sido. La expresión proporciona el número de elementos que se establecen en una matriz indexada, $ #arr [@] o $ #arr [*], como se muestra en el siguiente código:

arr [1] = 'Libro de ejercicios' arr [3] = regla arr [5] = lápiz
echo $ #arr [@]
echo $ #arr [*]

La salida es:

3
3

Mostrar solo elementos de conjunto de matriz indexados

Se establece un elemento de índice asignado un valor, mientras que el que no está asignado un valor no es. El siguiente código muestra solo los valores establecidos:

arr [1] = 'Libro de ejercicios' arr [3] = regla arr [5] = lápiz
para ((i = 0; i < $#arr[5]; ++i)); do
si [ ! -z "$ arr [i]"]; entonces
printf "$ arr [i]",
FI
hecho
eco

La salida es:

Libro de ejercicios, regla, lápiz,

Observe cómo se han identificado y eliminado los elementos no establecidos de la iteración en la condición. También tenga en cuenta que en la condición, $ arr [i] está en quotas dobles como "$ arr [i]", para que los valores que contengan espacios se puedan imprimir. El comando printf es similar al comando ECHO pero no agrega una nueva línea después de mostrar. Ha sido posible separar los valores en la salida, con una coma y espacio, en una línea. El último eco haría que la próxima salida vaya a la siguiente línea.

Una forma más simple del código anterior es la siguiente:

arr [1] = 'Libro de ejercicios' arr [3] = regla arr [5] = lápiz
para i en $ !arr [@]; hacer
printf "$ arr [i]",
hecho
eco

La salida es la misma. Tenga en cuenta la expresión de la lista después de la palabra reservada, en. Esta expresión devuelve la lista de índices. Por lo tanto, no hay necesidad de la condición if aquí.

Configuración y elementos indexados y su matriz

Cualquier elemento indexado que no haya sido asignado, un valor no es. Se establece un elemento indexado que tiene un valor asignado. Ahora, un elemento puede ser intencionalmente no establecido, como muestra el siguiente script:

arr [1] = 'Libro de ejercicios' arr [3] = regla arr [5] = lápiz
unset arr [3]
para i en $ !arr [@]; hacer
printf "$ arr [i]",
hecho
eco

La salida es:

Libro de ejercicios, lápiz,

"Ruler" no se ha mostrado. La sintaxis para unir un elemento es:

unset arrayname [subíndice]

La sintaxis para eliminar o no la matriz es:

Nombre de array

o

Unset ArrayName [@]

o

Unset ArrayName [*]

En el siguiente código, toda la matriz no es establecida:

arr = (Pen 'Libro de ejercicios' "Libro de texto" Regla 42 lápiz)
desastres arr
echo "$ arr [*]"

La salida no es nada (una línea vacía) porque toda la matriz ha sido no.

Matriz asociativa

Como se indicó anteriormente, un ejemplo de una matriz asociativa escrita en papel, es:

tinta => bolígrafo
papel suave => libro de ejercicios
papel duro => libro de texto
plástico => regla
papel especial => 42
madera => lápiz

Hay 6 elementos, cada uno que consiste en un par de clave/valor. Para el primer elemento, "Ink" es la clave y "Pen" es el valor; Para el segundo elemento, "Paper Soft" es la clave y el "Libro de ejercicios" es el valor; etcétera.

Creando una matriz asociativa

Una forma de crear la matriz anterior es la siguiente:

declarar -a arr = ([tinta] = plano [papel suave] = 'libro de ejercicios' [papel duro] = "libro de texto" [plástico] = regla [papel especial] = 42 [madera] = lápiz)

Aquí, arr es el nombre de la matriz. El programador podría haber dado algún otro nombre. Los espacios separan los diferentes elementos en la lista de matrices. Si un valor consta de más de una palabra, se escribe en cotizaciones simples o dobles. Una clave puede consistir en más de una palabra. Hay 6 pares de clave/valor en esta matriz asociada codificada. Se coloca una llave en soportes cuadrados. El valor se asigna a la clave, con el operador de asignación. '-A' significa una matriz asociativa, y debería estar allí.

Otra forma de crear la matriz anterior comienza de la siguiente manera:

declarar -A arr

Aquí, "Declarar" es una palabra reservada. '-A' significa una matriz asociativa (mientras que '-a' significa matriz indexada). "ARR" es el nombre de la elección del programador. Los elementos se pueden incluir de la siguiente manera:

declarar -A arr
arr [papel suave] = 'Libro de ejercicios'
arr [plástico] = regla
arr [madera] = lápiz

Todos los elementos (6) no deben incluirse necesariamente al mismo tiempo. El resto se puede agregar más tarde. Esto se suma por asignación. Recuerde, cuando se asigna cualquier valor a una variable, no debe haber espacio entre el operador de asignación, = y la variable o el valor.

Referencia Elemento de matriz asociativa

La sintaxis para hacer referencia a un elemento de matriz asociativo es:

$ nombre [subíndice]

Donde el nombre es el nombre de la matriz, como arr. El subíndice es la clave en forma de texto. En el siguiente código, los valores de los elementos se leen y se muestran:

Declare -a arr = ([tinta] = plano [papel soft] = 'libro de ejercicios' [papel duro] = "libro de texto" [plástico] = regla [papel especial] = 42 [madera] = lápiz)
echo $ arr [tinta]
echo $ arr [papel soft]
echo $ arr [papel duro]
echo $ arr [plástico]
echo $ arr [papel especial]
echo $ arr [madera]

La salida es:

bolígrafo
libro de ejercicios
libro de texto
gobernante
42
lápiz

Mostrar todos los valores en una matriz asociativa

Para mostrar todos los valores, se puede usar $ nombre [*] o $ nombre [@]. En estas expresiones, * o @ está en lugar de la clave. Y con eso, en lugar de devolver los valores de los elementos, los valores de los elementos presentes en la matriz se devuelven. El siguiente código ilustra esto:

declarar -A arr
arr [papel suave] = 'Libro de ejercicios' arr [plástico] = regla arr [madera] = lápiz
echo $ arr [@]
echo $ arr [*]

La salida es,

Regla de libros de ejercicios de lápiz
Regla de libros de ejercicios de lápiz

El orden de valores en la salida no tiene que corresponder al orden en la matriz asociativa. Observe que @ y * utilizados de esta manera son sinónimos. Hay un problema con la salida: las frases están separadas por espacios y no se pueden distinguir. El siguiente código separa las frases con comas:

declarar -A arr
arr [papel suave] = 'Libro de ejercicios' arr [plástico] = regla arr [madera] = lápiz
Ifs =,
echo "$ arr [@]"
echo "$ arr [*]"

La salida es ahora:

Regla de libros de ejercicios de lápiz
lápiz, libro de ejercicios, regla

IFS significa separador de campo interno. Se le ha asignado una coma. Tenga en cuenta el uso de cotizaciones dobles para $ arr [@] y $ arr [*] en los comandos de eco. Se han incluido comas para el subíndice * y no para el subíndice @. Todavía hay otro problema: en la segunda línea de salida, donde se han empleado comas, no se han mostrado espacios. Entonces, @ y * no son sinónimos todo el tiempo. Bueno, es posible separarse con coma y espacio; ver a continuación.

Mostrar todas las claves de matriz asociativa

La expresión, $ !nombre [@] o $ !Nombre [*] Devuelve las teclas de una matriz como una lista, separadas por espacios. Tenga en cuenta el uso y la posición del signo de exclamación (!). El siguiente código muestra el uso de estas expresiones:

declarar -A arr
arr [papel suave] = 'Libro de ejercicios' arr [plástico] = regla arr [madera] = lápiz
Echo $ !arr [@]
Echo $ !arr [*]

La salida es:

Madera de plástico de papel blando
Madera de plástico de papel blando

El orden de las claves de la matriz asociativa no tiene que ser el mismo que se declaró en la matriz.

Número de elementos de matriz asociativa

La expresión proporciona el número de elementos que se establecen en una matriz asociativa, $ #arr [@] o $ #arr [*], como se muestra en el siguiente código:

declarar -A arr
arr [papel suave] = 'Libro de ejercicios' arr [plástico] = regla arr [madera] = lápiz
echo $ #arr [@]
echo $ #arr [*]

La salida es:

3
3

Tenga en cuenta el uso y la posición del símbolo, #.

Mostrar solo elementos de conjunto de matriz asociativo

Se establece un elemento clave asignado un valor, mientras que el que no está asignado un valor no es. El siguiente código muestra solo los valores establecidos:

declarar -A arr
arr [tinta] = bolígrafo
$ arr [papel suave]; arr [papel suave] = 'Libro de ejercicios'
$ arr [papel duro]
arr [plástico] = regla
$ arr [papel especial]
arr [madera] = lápiz
para la clave en "$ !arr [@] "; hacer
printf "$ arr [$ key]",
hecho
eco

La salida es:

lápiz, libro de ejercicios, bolígrafo, regla,

Nuevamente, el posicionamiento de salida no está en el orden que se codificó. Tenga en cuenta que "$ !arr [@] "está en quotas dobles para que los valores que contengan espacios se puedan imprimir. Tenga en cuenta que en $ arr [$ key], la clave está precedida por $. El comando printf es similar al comando ECHO pero no agrega una nueva línea después de mostrar. Ha sido posible separar los valores en la salida, con una coma y espacio, en una línea. El último eco haría que la próxima salida vaya a la siguiente línea.

Configuración y elementos de matriz asociativos y su matriz

Cualquier elemento clave al que no se haya asignado un valor no es. Se establece un elemento clave que tiene un valor asignado. Ahora, un elemento puede ser intencionalmente no establecido, como muestra el siguiente script:

declarar -A arr
arr [papel suave] = 'Libro de ejercicios' arr [plástico] = regla arr [madera] = lápiz
unset arr [plástico]
para la clave en "$ !arr [@] "; hacer
printf "$ arr [$ key]",
hecho
eco

La salida es:

lápiz, libro de ejercicios,

"Ruler" no se ha mostrado. La sintaxis para unir un elemento es:

Unset ArrayName [clave]

La sintaxis para eliminar o no la matriz asociativa es:

Nombre de array

o

Unset ArrayName [@]

o

Unset ArrayName [*]

En el siguiente código, toda la matriz no es establecida:

declarar -a arr = ([tinta] = plano [papel suave] = 'libro de ejercicios' [papel duro] = "libro de texto" [plástico] = regla [papel especial] = 42 [madera] = lápiz)
desastres arr
echo "$ arr [*]"

La salida no es nada (una línea vacía) porque toda la matriz no ha sido.

Mostrar los valores de una matriz asociada

Mostrar los valores de una matriz asociada

declarar -a arr = ([tinta] = plano [papel suave] = 'libro de ejercicios' [papel duro] = "libro de texto" [plástico] = regla [papel especial] = 42 [madera] = lápiz)
para el valor en "$ arr [@]"; hacer
Echo $ valor
hecho

La salida es:

lápiz
42
libro de ejercicios
libro de texto
bolígrafo
gobernante

Nuevamente, el orden en que los valores se codifican en una matriz asociativa no tiene que ser el orden en que se muestran. Tenga en cuenta que @ se ha utilizado en lugar de * para la variable de lista. Además, se han utilizado cotizaciones dobles para la variable de lista.

Conclusión

Una matriz es una lista, ya sea numerada o clave. Cuando la matriz está numerada, es una matriz indexada. Cuando los valores están ubicados por claves, es una matriz asociativa. Con la matriz indexada, la numeración comienza desde cero. En la computación, la matriz debe codificarse. El programador necesita saber cómo crear la matriz. Necesita saber cómo agregar elementos a la matriz y eliminar elementos de la matriz. Necesita poder determinar el número de elementos en la matriz. Y él necesita saber cómo eliminar la matriz.