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
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.