logo

Bash Array

En aquest tema, demostrarem els conceptes bàsics de la matriu bash i com s'utilitzen en els scripts de l'intèrpret d'ordres bash.

Una matriu es pot definir com una col·lecció d'elements de tipus similar. A diferència de la majoria dels llenguatges de programació, les matrius en els scripts bash no necessiten ser la col·lecció d'elements similars. Com que Bash no discrimina la cadena d'un nombre, una matriu pot contenir tant cadenes com números.

Bash no proporciona suport per a les matrius multidimensionals; no podem tenir els elements que són matrius en si mateixos. Bash proporciona suport per a matrius unidimensionals indexades numèricament així com matrius associatives. Per accedir a la matriu indexada numèricament des de l'últim, podem utilitzar índexs negatius. L'índex de '-1' es considerarà com a referència per a l'últim element. Podem utilitzar diversos elements en una matriu.

Declaració Bash Array

Les matrius a Bash es poden declarar de les maneres següents:

Creació de matrius indexades numèricament

Podem utilitzar qualsevol variable com a matriu indexada sense declarar-la.

Per declarar explícitament una variable com a matriu Bash, utilitzeu la paraula clau 'declare' i la sintaxi es pot definir com:

 declare -a ARRAY_NAME 

on,

ARRAY_NAME indica el nom que assignaríem a la matriu.

Nota:Les regles per anomenar una variable a Bash són les mateixes per anomenar una matriu.

Un mètode general per crear una matriu indexada es pot definir de la forma següent:

 ARRAY_NAME[index_1]=value_1 ARRAY_NAME[index_2]=value_2 ARRAY_NAME[index_n]=value_n 

on la paraula clau 'índex' s'utilitza per definir nombres enters positius.

Creació de matrius associatives

A diferència de les matrius indexades numèricament, les matrius associatives es declaren primer. Podem utilitzar la paraula clau 'declare' i l'opció -A (majúscula) per declarar les matrius associatives. La sintaxi es pot definir com:

 declare -A ARRAY_NAME 

Un mètode general per crear una matriu associativa es pot definir de la forma següent:

 declare -A ARRAY_NAME ARRAY_NAME[index_foo]=value_foo ARRAY_NAME[index_bar]=value_bar ARRAY_NAME[index_xyz]=value_xyz 

on index_ s'utilitza per definir qualsevol cadena.

També podem escriure el formulari anterior de la següent manera:

mvc amb java
 declare -A ARRAY_NAME ARRAY_NAME=( [index_foo]=value_foo [index_bar]=value_bar [index_xyz]=value_xyz ) 

Inicialització de la matriu Bash

Per inicialitzar una matriu Bash, podem utilitzar l'operador d'assignació (=), especificant la llista d'elements entre parèntesis, separats per espais com a continuació:

 ARRAY_NAME=(element_1st element_2nd element_Nth) 

Nota:Aquí, el primer element tindrà un índex 0. A més, no hi hauria d'haver cap espai al voltant de l'operador d'assignació (=).

Accediu als elements de Bash Array

Per accedir als elements d'una matriu Bash, podem utilitzar la sintaxi següent:

 echo ${ARRAY_NAME[2]} 

Imprimeix la matriu Bash

Podem utilitzar la paraula clau 'declare' amb una opció '-p' per imprimir tots els elements d'un Bash Array amb tots els índexs i detalls. La sintaxi per imprimir la matriu Bash es pot definir com:

 declare -p ARRAY_NAME 

Operacions de matriu

Un cop assignada una matriu, podem fer-hi algunes operacions útils. Podem mostrar les seves claus i valors així com modificar-lo afegint o eliminant els elements:

Elements de referència

Per fer referència a un sol element, hem de conèixer el número d'índex de l'element. Podem fer referència o imprimir qualsevol element utilitzant la sintaxi següent:

 ${ARRAY_NAME[index]} 

Nota:Les claus ${} són necessàries per evitar els operadors d'expansió de noms de fitxer de shell.

Per exemple, imprimim un element d'una matriu amb un índex de 2:

Bash Script

 #!/bin/bash #Script to print an element of an array with an index of 2 #declaring the array declare -a example_array=( 'Welcome''To''Javatpoint' ) #printing the element with index of 2 echo ${example_array[2]} 

Sortida

 Javatpoint 

Si fem servir @ o * en lloc d'un índex especificat, s'ampliarà a tots els membres de la matriu. Per imprimir tots els elements, podem utilitzar el següent formulari:

Bash Script

 #!/bin/bash #Script to print all the elements of the array #declaring the array declare -a example_array=( 'Welcome''To''Javatpoint' ) #Printing all the elements echo '${example_array[@]}' 

Sortida

 Welcome to Javatpoint 

L'única diferència entre utilitzar @ i * és que el formulari està envoltat de cometes dobles mentre s'utilitza @. En el primer cas (mentre s'utilitza @), l'expansió proporciona un resultat en una paraula per a cada element de la matriu. Es pot descriure millor amb l'ajuda de 'for loop'. Suposem que tenim una matriu amb tres elements, 'Benvingut', 'A' i 'Javatpoint':

 $ example_array= (Welcome to Javatpoint) 

Aplicant un bucle amb @:

 for i in '${example_array[@]}'; do echo '$i'; done 

Produirà el resultat següent:

combinar ordena java
 Welcome To Javatpoint 

Aplicant un bucle amb *, es produirà un únic resultat amb tots els elements de la matriu com una sola paraula:

 Welcome To Javatpoint 

És important entendre l'ús de @ i * perquè és útil mentre s'utilitza el formulari per iterar a través dels elements de la matriu.

Impressió de les claus d'una matriu

També podem recuperar i imprimir les claus utilitzades en matrius indexades o associatives, en lloc dels seus valors respectius. Es pot realitzar afegint ! operador abans del nom de la matriu com a continuació:

làtex de mida de text
 ${!ARRAY_NAME[index]} 

Exemple

 #!/bin/bash #Script to print the keys of the array #Declaring the Array declare -a example_array=( 'Welcome''To''Javatpoint' ) #Printing the Keys echo '${!example_array[@]}' 

Sortida

 0 1 2 

Trobar la longitud de la matriu

Podem comptar el nombre d'elements continguts a la matriu utilitzant la forma següent:

 ${#ARRAY_NAME[@]} 

Exemple

 #!/bin/bash #Declaring the Array declare -a example_array=( 'Welcome''To''Javatpoint' ) #Printing Array Length echo 'The array contains ${#example_array[@]} elements' 

Sortida

 The array contains 3 elements 

Recorre la matriu

El mètode general per iterar sobre cada element d'una matriu és utilitzar el 'bucle for'.

Exemple

 #!/bin/bash #Script to print all keys and values using loop through the array declare -a example_array=( 'Welcome''To''Javatpoint' ) #Array Loop for i in '${!example_array[@]}' do echo The key value of element '${example_array[$i]}' is '$i' done 

Sortida

Bash Array

Un altre mètode comú per fer un bucle a través d'una matriu és recuperar la longitud de la matriu i utilitzar el bucle d'estil C:

Bash Script

 #!/bin/bash #Script to loop through an array in C-style declare -a example_array=( &apos;Welcome&apos;&apos;To&apos;&apos;Javatpoint&apos; ) #Length of the Array length=${#example_array[@]} #Array Loop for (( i=0; i <${length}; i++ )) do echo $i ${example_array[$i]} done < pre> <p> <strong>Output</strong> </p> <img src="//techcodeview.com/img/bash-tutorial/77/bash-array-2.webp" alt="Bash Array"> <h3>Adding Elements to an Array</h3> <p>We have an option to add elements to an indexed or associative array by specifying their index or associative key respectively. To add the new element to an array in bash, we can use the following form:</p> <pre> ARRAY_NAME[index_n]=&apos;New Element&apos; </pre> <p> <strong>Example</strong> </p> <pre> #!/bin/bash #Declaring an array declare -a example_array=( &apos;Java&apos;&apos;Python&apos;&apos;PHP&apos;&apos;HTML&apos; ) #Adding new element example_array[4]=&apos;JavaScript&apos; #Printing all the elements echo &apos;${example_array[@]}&apos; </pre> <p> <strong>Output</strong> </p> <pre> Java Python PHP HTML JavaScript </pre> <p>Another method for adding a new element to an array is by using the += operator. There is no need to specify the index in this method. We can add one or multiple elements in the array by using the following way:</p> <p> <strong>Example</strong> </p> <pre> #!/bin/bash #Declaring the Array declare -a example_array=( &apos;Java&apos;&apos;Python&apos;&apos;PHP&apos; ) #Adding new elements example_array+=( JavaScript CSS SQL ) #Printing all the elements echo &apos;${example_array[@]}&apos; </pre> <p> <strong>Output</strong> </p> <pre> Java Python PHP JavaScript CSS SQL </pre> <h3>Updating Array Element</h3> <p>We can update the array element by assigning a new value to the existing array by its index value. Let&apos;s change the array element at index 4 with an element &apos;Javatpoint&apos;.</p> <p> <strong>Example</strong> </p> <pre> #!/bin/bash #Script to update array element #Declaring the array declare -a example_array=( &apos;We&apos;&apos;welcome&apos;&apos;you&apos;&apos;on&apos;&apos;SSSIT&apos; ) #Updating the Array Element example_array[4]=Javatpoint #Printig all the elements of the Array echo ${example_array[@]} </pre> <p> <strong>Output</strong> </p> <pre> We welcome you on Javatpoint </pre> <h3>Deleting an Element from an Array</h3> <p>If we want to delete the element from the array, we have to know its index or key in case of an associative array. An element can be removed by using the &apos; <strong>unset</strong> &apos; command:</p> <pre> unset ARRAY_NAME[index] </pre> <p>An example is shown below to provide you a better understanding of this concept:</p> <p> <strong>Example</strong> </p> <pre> #!/bin/bash #Script to delete the element from the array #Declaring the array declare -a example_array=( &apos;Java&apos;&apos;Python&apos;&apos;HTML&apos;&apos;CSS&apos;&apos;JavaScript&apos; ) #Removing the element unset example_array[1] #Printing all the elements after deletion echo &apos;${example_array[@]}&apos; </pre> <p> <strong>Output</strong> </p> <pre> Java HTML CSS JavaScript </pre> <p>Here, we have created a simple array consisting of five elements, &apos;Java&apos;, &apos;Python&apos;, &apos;HTML&apos;, &apos;CSS&apos; and &apos;JavaScript&apos;. Then we removed the element &apos;Python&apos; from the array by using &apos;unset&apos; and referencing the index of it. The index of element &apos;Python&apos; was &apos;1&apos;, since bash arrays start from 0. If we check the indexes of the array after removing the element, we can see that the index for the removed element is missing. We can check the indexes by adding the following command into the script:</p> <pre> echo ${!example_array[@]} </pre> <p>The output will look like:</p> <pre> 0 2 3 4 </pre> <p>This concept also works for the associative arrays.</p> <h3>Deleting the Entire Array</h3> <p>Deleting an entire array is a very simple task. It can be performed by passing the array name as an argument to the &apos; <strong>unset</strong> &apos; command without specifying the index or key.</p> <p> <strong>Example</strong> </p> <pre> #!/bin/bash #Script to delete the entire Array #Declaring the Array declare -a example_array=( &apos;Java&apos;&apos;Python&apos;&apos;HTML&apos;&apos;CSS&apos;&apos;JavaScript&apos; ) #Deleting Entire Array unset example_array #Printing the Array Elements echo ${!example_array[@]} #Printing the keys echo ${!example_array[@]} </pre> <p> <strong>Output</strong> </p> <img src="//techcodeview.com/img/bash-tutorial/77/bash-array-3.webp" alt="Bash Array"> <p>There will be no output if we try to print the content of the above script. An empty result is returned because the array doesn&apos;t exist anymore.</p> <h3>Slice Array Elements</h3> <p>Bash arrays can also be sliced from a given starting index to the ending index.</p> <p>To slice an array from starting index &apos;m&apos; to an ending index &apos;n&apos;, we can use the following syntax:</p> <pre> SLICED_ARRAY=(${ARRAY_NAME[@]:m:n}&apos;) </pre> <p> <strong>Example</strong> </p> <pre> #!/bin/bash #Script to slice Array Element from index 1 to index 3 #Declaring the Array example_array=( &apos;Java&apos;&apos;Python&apos;&apos;HTML&apos;&apos;CSS&apos;&apos;JavaScript&apos; ) #Slicing the Array sliced_array=(&apos;${example_array[@]:1:3}&apos;) #Applying for loop to iterate over each element in Array for i in &apos;${sliced_array[@]}&apos; do echo $i done </pre> <p> <strong>Output</strong> </p> <img src="//techcodeview.com/img/bash-tutorial/77/bash-array-4.webp" alt="Bash Array"> <hr></${length};>

Exemple

 #!/bin/bash #Declaring an array declare -a example_array=( &apos;Java&apos;&apos;Python&apos;&apos;PHP&apos;&apos;HTML&apos; ) #Adding new element example_array[4]=&apos;JavaScript&apos; #Printing all the elements echo &apos;${example_array[@]}&apos; 

Sortida

 Java Python PHP HTML JavaScript 

Un altre mètode per afegir un element nou a una matriu és utilitzar l'operador +=. No cal especificar l'índex en aquest mètode. Podem afegir un o diversos elements a la matriu utilitzant la manera següent:

Exemple

 #!/bin/bash #Declaring the Array declare -a example_array=( &apos;Java&apos;&apos;Python&apos;&apos;PHP&apos; ) #Adding new elements example_array+=( JavaScript CSS SQL ) #Printing all the elements echo &apos;${example_array[@]}&apos; 

Sortida

 Java Python PHP JavaScript CSS SQL 

S'està actualitzant l'element Array

Podem actualitzar l'element de matriu assignant un nou valor a la matriu existent pel seu valor d'índex. Canviem l'element de la matriu a l'índex 4 amb un element 'Javatpoint'.

Exemple

 #!/bin/bash #Script to update array element #Declaring the array declare -a example_array=( &apos;We&apos;&apos;welcome&apos;&apos;you&apos;&apos;on&apos;&apos;SSSIT&apos; ) #Updating the Array Element example_array[4]=Javatpoint #Printig all the elements of the Array echo ${example_array[@]} 

Sortida

 We welcome you on Javatpoint 

Eliminació d'un element d'una matriu

Si volem eliminar l'element de la matriu, hem de conèixer el seu índex o clau en cas de matriu associativa. Es pot eliminar un element utilitzant el ' sense fixar ' comandament:

 unset ARRAY_NAME[index] 

A continuació es mostra un exemple per entendre millor aquest concepte:

Exemple

 #!/bin/bash #Script to delete the element from the array #Declaring the array declare -a example_array=( &apos;Java&apos;&apos;Python&apos;&apos;HTML&apos;&apos;CSS&apos;&apos;JavaScript&apos; ) #Removing the element unset example_array[1] #Printing all the elements after deletion echo &apos;${example_array[@]}&apos; 

Sortida

 Java HTML CSS JavaScript 

Aquí, hem creat una matriu senzilla que consta de cinc elements, 'Java', 'Python', 'HTML', 'CSS' i 'JavaScript'. A continuació, vam eliminar l'element 'Python' de la matriu utilitzant 'unset' i fent referència a l'índex d'aquest. L'índex de l'element 'Python' era '1', ja que les matrius bash comencen des de 0. Si comprovem els índexs de la matriu després d'eliminar l'element, podem veure que falta l'índex de l'element eliminat. Podem comprovar els índexs afegint la següent comanda a l'script:

 echo ${!example_array[@]} 

La sortida es veurà així:

 0 2 3 4 

Aquest concepte també funciona per a les matrius associatives.

Eliminació de la matriu sencera

Suprimir una matriu sencera és una tasca molt senzilla. Es pot realitzar passant el nom de la matriu com a argument al ' sense fixar ' ordre sense especificar l'índex o la clau.

Exemple

mysql no és igual
 #!/bin/bash #Script to delete the entire Array #Declaring the Array declare -a example_array=( &apos;Java&apos;&apos;Python&apos;&apos;HTML&apos;&apos;CSS&apos;&apos;JavaScript&apos; ) #Deleting Entire Array unset example_array #Printing the Array Elements echo ${!example_array[@]} #Printing the keys echo ${!example_array[@]} 

Sortida

Bash Array

No hi haurà sortida si intentem imprimir el contingut de l'script anterior. Es retorna un resultat buit perquè la matriu ja no existeix.

Elements de la matriu de talls

Les matrius Bash també es poden tallar des d'un índex inicial determinat fins a l'índex final.

Per tallar una matriu des de l'índex inicial 'm' fins a un índex final 'n', podem utilitzar la sintaxi següent:

 SLICED_ARRAY=(${ARRAY_NAME[@]:m:n}&apos;) 

Exemple

 #!/bin/bash #Script to slice Array Element from index 1 to index 3 #Declaring the Array example_array=( &apos;Java&apos;&apos;Python&apos;&apos;HTML&apos;&apos;CSS&apos;&apos;JavaScript&apos; ) #Slicing the Array sliced_array=(&apos;${example_array[@]:1:3}&apos;) #Applying for loop to iterate over each element in Array for i in &apos;${sliced_array[@]}&apos; do echo $i done 

Sortida

Bash Array