Una matriz es una variable que contiene múltiples valores que pueden ser del mismo tipo o de diferente tipo. No existe un límite máximo para el tamaño de una matriz, ni ningún requisito de que las variables miembro se indexen o asignen de forma contigua. El índice de matriz comienza con cero.
En este artículo, repasemos 15 operaciones de matriz diferentes en bash.
Este artículo es parte de la serie de Tutoriales de Bash en curso. Para aquellos que son nuevos en bash scripting, obtenga un buen comienzo con el tutorial de introducción a Bash Scripting.
1. Declarar una matriz y asignar valores
En bash, la matriz se crea automáticamente cuando se usa una variable en el formato como,
name[index]=value
- nombre es cualquier nombre para una matriz
- índice podría ser cualquier número o expresión que debe evaluarse como un número mayor o igual a cero. Puede declarar una matriz explícita utilizando declare -a arrayname.
$ cat arraymanip.sh #! /bin/bash Unix[0]='Debian' Unix[1]='Red hat' Unix[2]='Ubuntu' Unix[3]='Suse' echo ${Unix[1]} $./arraymanip.sh Red hat
Para acceder a un elemento de una matriz, use corchetes como ${nombre[índice]}.
2. Inicializar una matriz durante la declaración
En lugar de inicializar cada elemento de una matriz por separado, puede declarar e inicializar una matriz especificando la lista de elementos (separados por espacios en blanco) entre llaves.
Syntax: declare -a arrayname=(element1 element2 element3)
Si los elementos tienen el carácter de espacio en blanco, enciérrelo entre comillas.
#! /bin/bash $cat arraymanip.sh declare -a Unix=('Debian' 'Red hat' 'Red hat' 'Suse' 'Fedora');
declare -a declara una matriz y todos los elementos entre paréntesis son los elementos de una matriz.
3. Imprima toda la matriz Bash
Hay diferentes formas de imprimir los elementos completos de la matriz. Si el número de índice es @ o *, se hace referencia a todos los miembros de una matriz. Puede recorrer los elementos de la matriz e imprimirlos, utilizando sentencias de bucle en bash.
echo ${Unix[@]} # Add the above echo statement into the arraymanip.sh #./t.sh Debian Red hat Ubuntu Suse
Hacer referencia al contenido de una variable miembro de una matriz sin proporcionar un número de índice es lo mismo que hacer referencia al contenido del primer elemento, al que se hace referencia con el número de índice cero.
4. Longitud de la matriz Bash
Podemos obtener la longitud de una matriz usando el parámetro especial llamado $#.
${#arrayname[@]} te da la longitud de la matriz.
$ cat arraymanip.sh declare -a Unix=('Debian' 'Red hat' 'Suse' 'Fedora'); echo ${#Unix[@]} #Number of elements in the array echo ${#Unix} #Number of characters in the first element of the array.i.e Debian $./arraymanip.sh 4 6
5. Longitud del elemento n en una matriz
${#arrayname[n]} debe dar la longitud del elemento n en una matriz.
$cat arraymanip.sh #! /bin/bash Unix[0]='Debian' Unix[1]='Red hat' Unix[2]='Ubuntu' Unix[3]='Suse' echo ${#Unix[3]} # length of the element located at index 3 i.e Suse $./arraymanip.sh 4
6. Extracción por desplazamiento y longitud de una matriz
El siguiente ejemplo muestra la forma de extraer 2 elementos a partir de la posición 3 de una matriz llamada Unix.
$cat arraymanip.sh Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora' 'UTS' 'OpenLinux'); echo ${Unix[@]:3:2} $./arraymanip.sh Suse Fedora
El ejemplo anterior devuelve los elementos en el tercer y cuarto índice. El índice siempre comienza con cero.
7. Extracción con desplazamiento y longitud, para un elemento particular de una matriz
Para extraer solo los primeros cuatro elementos de un elemento de matriz. Por ejemplo, Ubuntu, que se encuentra en el segundo índice de una matriz, puede usar el desplazamiento y la longitud para un elemento particular de una matriz.
$cat arraymanip.sh #! /bin/bash Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora' 'UTS' 'OpenLinux'); echo ${Unix[2]:0:4} ./arraymanip.sh Ubun
El ejemplo anterior extrae los primeros cuatro caracteres del segundo elemento indexado de una matriz.
8. Buscar y reemplazar en una matriz de elementos
El siguiente ejemplo, busca Ubuntu en una matriz de elementos y reemplaza lo mismo con la palabra 'SCO Unix'.
$cat arraymanip.sh #!/bin/bash Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora' 'UTS' 'OpenLinux'); echo ${Unix[@]/Ubuntu/SCO Unix} $./arraymanip.sh Debian Red hat SCO Unix Suse Fedora UTS OpenLinux
En este ejemplo, reemplaza el elemento en el segundo índice 'Ubuntu' con 'SCO Unix'. Pero este ejemplo no reemplazará permanentemente el contenido de la matriz.
9. Agregar un elemento a un Bash Array existente
El siguiente ejemplo muestra la forma de agregar un elemento a la matriz existente.
$cat arraymanip.sh Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora' 'UTS' 'OpenLinux'); Unix=("${Unix[@]}" "AIX" "HP-UX") echo ${Unix[7]} $./arraymanip.sh AIX
En la matriz llamada Unix, los elementos 'AIX' y 'HP-UX' se agregan en el índice 7 y 8 respectivamente.
10. Eliminar un elemento de una matriz
unset se usa para eliminar un elemento de una matriz. unset tendrá el mismo efecto que asignar un valor nulo a un elemento.
$cat arraymanip.sh #!/bin/bash Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora' 'UTS' 'OpenLinux'); unset Unix[3] echo ${Unix[3]}
El script anterior simplemente imprimirá nulo, que es el valor disponible en el tercer índice. El siguiente ejemplo muestra una de las formas de eliminar un elemento por completo de una matriz.
$ cat arraymanip.sh Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora' 'UTS' 'OpenLinux'); pos=3 Unix=(${Unix[@]:0:$pos} ${Unix[@]:$(($pos + 1))}) echo ${Unix[@]} $./arraymanip.sh Debian Red hat Ubuntu Fedora UTS OpenLinux
En este ejemplo, ${Unix[@]:0:$pos} le dará 3 elementos a partir del índice 0, es decir, 0,1,2 y ${Unix[@]:4} le dará los elementos del índice 4 al último índice. Y combine ambos resultados anteriores. Esta es una de las soluciones para eliminar un elemento de una matriz.
11. Eliminar elementos de matriz Bash usando patrones
En la condición de búsqueda, puede proporcionar los patrones y almacenar el elemento restante en otra matriz, como se muestra a continuación.
$ cat arraymanip.sh #!/bin/bash declare -a Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora'); declare -a patter=( ${Unix[@]/Red*/} ) echo ${patter[@]} $ ./arraymanip.sh Debian Ubuntu Suse Fedora
El ejemplo anterior elimina los elementos que tienen el patrón Rojo*.
12. Copiando una matriz
Expanda los elementos de la matriz y guárdelos en una nueva matriz como se muestra a continuación.
#!/bin/bash Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora' 'UTS' 'OpenLinux'); Linux=("${Unix[@]}") echo ${Linux[@]} $ ./arraymanip.sh Debian Red hat Ubuntu Fedora UTS OpenLinux
13. Concatenación de dos Bash Arrays
Expanda los elementos de las dos matrices y asígnelos a la nueva matriz.
$cat arraymanip.sh #!/bin/bash Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora' 'UTS' 'OpenLinux'); Shell=('bash' 'csh' 'jsh' 'rsh' 'ksh' 'rc' 'tcsh'); UnixShell=("${Unix[@]}" "${Shell[@]}") echo ${UnixShell[@]} echo ${#UnixShell[@]} $ ./arraymanip.sh Debian Red hat Ubuntu Suse Fedora UTS OpenLinux bash csh jsh rsh ksh rc tcsh 14
Imprime la matriz que tiene los elementos de la matriz 'Unix' y 'Shell', y el número de elementos de la nueva matriz es 14.
14. Eliminación de una matriz completa
unset se usa para eliminar una matriz completa.
$cat arraymanip.sh #!/bin/bash Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora' 'UTS' 'OpenLinux'); Shell=('bash' 'csh' 'jsh' 'rsh' 'ksh' 'rc' 'tcsh'); UnixShell=("${Unix[@]}" "${Shell[@]}") unset UnixShell echo ${#UnixShell[@]} $ ./arraymanip.sh 0
Después de desarmar una matriz, su longitud sería cero como se muestra arriba.
15. Cargar contenido de un archivo en una matriz
Puede cargar el contenido del archivo línea por línea en una matriz.
#Example file $ cat logfile Welcome to thegeekstuff Linux Unix $ cat loadcontent.sh #!/bin/bash filecontent=( `cat "logfile" `) for t in "${filecontent[@]}" do echo $t done echo "Read file content!" $ ./loadcontent.sh Welcome to thegeekstuff Linux Unix Read file content!
En el ejemplo anterior, cada índice de un elemento de matriz se ha impreso a través del ciclo for.
Lecturas recomendadas
Bash 101 Hacks, por Ramesh Natarajan . Paso la mayor parte de mi tiempo en el entorno Linux. Entonces, naturalmente, soy un gran admirador de la línea de comandos de Bash y las secuencias de comandos de Shell. Hace 15 años, cuando estaba trabajando en diferentes versiones de *nix, solía escribir mucho código en C shell y Korn shell. Años más tarde, cuando comencé a trabajar en Linux como administrador del sistema, prácticamente automaticé todas las tareas posibles utilizando scripts de shell Bash. Basado en mi experiencia con Bash, he escrito el libro electrónico Bash 101 Hacks que contiene 101 ejemplos prácticos tanto en la línea de comandos de Bash como en las secuencias de comandos de shell. Si ha estado pensando en dominar Bash, hágase un favor y lea este libro, que lo ayudará a tomar el control de su línea de comandos y secuencias de comandos de shell de Bash.