logo

Bash Scripting - Matriu

Arrays són conceptes importants en programació o scripting. Les matrius ens permeten emmagatzemar i recuperar elements en forma de llista que es poden utilitzar per a determinades tasques. A bash, també tenim matrius que ens ajuden a crear scripts a la línia d'ordres per emmagatzemar dades en format de llista. En aquest article, entendrem els fonaments bàsics de les matrius en els scripts bash.

Creació de matrius

Per crear una matriu bàsica en un script bash, podem utilitzar declarar -a comanda seguida del nom de la variable de matriu que voleu donar.



#!/bin/usr/env bash declare -a sport=( [0]=football [1]=cricket [2]=hockey [3]=basketball )>

O

#!/bin/usr/env bash sport[0]=football sport[1]=cricket sport[2]=hockey sport[3]=basketball>

El valor dels elements pot ser qualsevol nombre enter o cadenes o qualsevol altra forma de dades que es desitgi. Podem veure que la matriu es declara en un script bash de dues maneres, la primera sembla més convenient i menys agitada de declarar. Si volem declarar la matriu d'una vegada, la primera és l'opció òptima, però si els elements s'han d'afegir en trossos, la segona és una bona opció.

Impressió de les matrius

Després de declarar la matriu, si volíem mostrar tots els elements de la matriu podem utilitzar el símbol @.



#!/bin/usr/env bash declare -a sport=( [0]=football [1]=cricket [2]=hockey [3]=basketball ) echo '${sport[@]}'>

echo '${array_name[@]}'>

Utilitzem [@] com a índex de la matriu per mostrar tots els elements. Tots els elements s'imprimeixen amb espais separats, les cometes al voltant de la variable s'expandeixen i imprimeixen tots els elements de la matriu.

Iterant sobre la matriu

Per iterar sobre una matriu un element a la vegada, podem utilitzar bucles i realitzar qualsevol operació dins del cos.



#!/bin/usr/env bash declare -a sport=( [0]=football [1]=cricket [2]=hockey [3]=basketball ) for i in ${nums[@]} do echo -e '$i 
' done>

Com podem veure, hem utilitzat un bucle for per imprimir l'element de la matriu un per un. Hem utilitzat el truc de la secció anterior d'aconseguir tots els elements de la matriu i repetir-hi un per un en el bucle for. El ${array_name[@]} s'expandeix a tots els elements de la matriu i el bucle for els itera un per un amb l'iterador de l'exemple, és el variable i , dins del cos del bucle for imprimim el variable/iterador i i així iterar sobre la matriu.

Obteniu el nombre d'elements de la matriu

Per obtenir el nombre de la matriu d'elements podem utilitzar l'operador # abans del nom de la matriu a la s a ${array_name[@]}.

 #!/bin/usr/env bash declare -a sport=( [0]=football [1]=cricket [2]=hockey [3]=basketball ) echo '${#sport[@]}'>

Per tant, retornem la mida de la matriu mitjançant l'ordre ${#sport[@]}, el # s'utilitza per obtenir la mida de la variable que hi ha al costat, utilitzant les cometes dobles s'avalua el valor de l'ordre i obtenim el nombre d'elements de la matriu com es desitja.

Inserció d'un element a Array

Per inserir un element és bastant senzill, hem d'establir l'índex adequat de l'element seguit del valor de l'element que us agradava donar.

#!/bin/usr/env bash declare -a sport=( [0]=football [1]=cricket [2]=hockey [3]=basketball ) echo '${sport[@]}' sport[4]='dodgeball' sport[2]='golf' echo '${sport[@]}'>

Hem afegit el 5è element (4t índex) a la matriu i també hem modificat/editat el 3r element de la matriu (2n índex). El arrayname[índex]=valor són tots els trucs per afegir, modificar o inicialitzar els elements de la matriu.

També podem afegir elements a una matriu mitjançant l'operador +=.

#!/bin/usr/env bash declare -a sport=( [0]=football [1]=cricket [2]=hockey [3]=basketball ) echo '${sport[@]}' sport+=('golf' 'baseball') echo '${sport[@]}' echo 'Size : ${#sport[@]}'>

Com es veu a l'exemple, podem afegir diversos elements a la matriu amb un codi mínim. Utilitzem el nom_matriu+=(elements) per afegir elements a la matriu.

Eliminació d'un element de la matriu

Per eliminar un element de la matriu, podem utilitzar l'ordre unset. L'ordre pren el nom de la variable en el nostre cas el nom de la matriu i l'índex d'aquest element. L'índex també pot ser relatiu, és a dir, -1 que indica l'últim element i -2 al penúltim i així successivament.

#!/bin/usr/env bash declare -a sport=( [0]=football [1]=cricket [2]=hockey [3]=basketball ) unset sport[1] echo '${sport[@]}' echo '${#sport[@]}'>

Com podem veure, unset arrayname[index] suprimirà l'element a l'índex de la matriu. A més, la mida de la matriu s'ha reduït a 3 de 4, cosa que indica que l'element s'elimina completament i no només es substitueix per espais en blanc.

Utilitzant índexs relatius

Si utilitzem índexs com -1,-2, etc., els elements es refereixen des de l'últim element i, per tant, també els podem esborrar o modificar amb un ordre relatiu des de la part posterior.

#!/bin/usr/env bash declare -a sport=( [0]=football [1]=cricket [2]=hockey [3]=basketball ) unset sport[-3] echo '${sport[@]}'>

Com podem veure, l'índex 1 també es fa referència com a -3 des del darrere i, per tant, es fa relativament més fàcil fer referència a determinats elements en una matriu gran.

Empalma una matriu

Podem empalmar (treure una poció) una matriu per prendre-la assignar-la o imprimir-la a una altra variable/matriu.

#!/bin/usr/env bash declare -a sport sport+=('football' 'cricket' 'hockey' 'basketball') sport+=('golf' 'baseball') echo 'sport = ${sport[@]}' arr='${sport[@]:1:3}' echo 'arr = ${arr[@]}'>

Hem extret un tros de la matriu esport, és a dir, l'element entre els índexs 1 i 3 inclosos i l'hem assignat a la variable arr que també és una matriu. L'operador @ obté tots els elements de la matriu i després podem empalmar la matriu entre els índexs 1 i 3 de manera que tinguem els elements a 1, 2 i 3 (cricket, hoquei i beisbol) de la matriu esportiva.

Definiu una matriu estàtica i imprimiu els elements de la matriu

#To declare static Array programmingArray=(Java Python Ruby Perl) #In below 2 ways we can print the elements of the static array echo 'Way 1 of printing static values by using [@]:0 - ' ${programmingarray[@]$ echo 'Way 2 of printing static values by using [*]:0 - ' ${programmingarray[*]$>

De 2 maneres podem imprimir elements de matriu estàtica

Execució del programa

sh So, we can give as sh arraycheck2.sh # arraycheck2.sh is the name of the script file here>

Passar els arguments de la línia d'ordres en un fitxer d'script

#All the array elements are stored in an array called programmingArray programmingArray=('$@') #Index values start from 0 #If we do not specify the index, it will take up the size of first index value echo 'Size of programmingArray at 0th location..:' $(#programmingArray[0]} echo 'Size of programmingArray at 1st location..:' $(#programmingArray[1]}>

L'script anterior es pot executar com

# Aquí Java, Python i Ruby són arguments de línia d'ordres

primer cerca de profunditat de l'algorisme
sh arrayCheck.sh Java Python Ruby>

Passos d'execució de l'script:

programmingArray=(Java Python Ruby)

#Java estarà present a l'índex 0, la seva mida es pot calcular de la manera següent

${#programmingArray[0]}

De la mateixa manera, Python estarà present al primer índex, la seva mida es pot calcular de la manera següent

${#programmingArray[1]}

Sortida:

Iteració dels valors de la matriu utilitzant el bucle for

$@ donarà tots els valors que s'han passat mitjançant arguments de línia d'ordres i s'emmagatzema en una matriu.

Es pot repetir utilitzant el bucle for

declare -a programmingArray=('$@') i=0 for programming in '$@' do echo 'Array value at index ' $i ' : ' $programming i=$((i+1)); done>

Sortida:

Fem una ullada ràpida al que representen tots i cadascun dels símbols

Sintaxi

Sortida
arr=()

arr[0]=3 Sobreescriu el primer element

arr+=(4) Afegeix valors

str=$(ls) Desa la sortida com a cadena

arr=( $(ls) ) Desa ls sortida com una matriu de fitxers

${arr[@]:s:n} Recupera n elements començant per l'índex

#Podem proporcionar un conjunt de valors

com això

arr=(un dos tres)

Per inicialitzar una matriu
${arr[0]} Per recuperar el primer element. L'índex comença sempre per 0
${arr[@]} Per recuperar tots els elements i després podem iterar en un bucle
${!arr[@]} Per recuperar només índexs de matriu
${#arr[@]} Per calcular la mida d'una matriu
arr[2]=3 Per sobreescriure el 3r element hem d'utilitzar-lo d'aquesta manera. Com que l'índex comença a 0, arr[2] és correcte.
arr+=(40) Per afegir valors, podem utilitzar + i després assignar amb = i, per tant, s'utilitza +=.
str=$(ls) Per desar la sortida de l'ordre ls com a cadena (es mostra l'exemple 4 per a aquesta sortida)
arr=( $(ls) ) Per desar ls sortida com a matriu de fitxers (es mostra l'exemple 5 per a aquesta sortida)
${arr[@]:s:n} Per recuperar n elements a partir de l'índex s