Darbas su masyvais „Linux Shell Scripting“ - 8 dalis
Neįsivaizduojame programavimo kalbos be masyvų sąvokos. Nesvarbu, kaip jie įgyvendinami tarp įvairių kalbų. Vietoj to masyvai padeda konsoliduoti duomenis, panašius ar skirtingus, vienu simboliniu pavadinimu.
Kadangi mums rūpi „shell“ scenarijai, šis straipsnis padės jums žaisti su kai kuriais „shell“ scenarijais, kurie naudoja šią masyvų koncepciją.
Masyvo inicijavimas ir naudojimas
Naudojant naujesnes „bash“ versijas, jis palaiko vieno matmens masyvus. Masyvą gali aiškiai deklaruoti „ deklaruoti “ įmontuotas apvalkalas.
declare -a var
Tačiau nebūtina deklaruoti masyvo kintamųjų, kaip nurodyta aukščiau. Mes galime įterpti atskirus elementus į masyvą tiesiogiai taip.
var[XX]=<value>
kur ‘XX’ žymi masyvo indeksą. Norėdami išskirti masyvo elementus, naudokite garbanotojo skliaustelio sintaksę, t.
${var[XX]}
Pastaba: masyvo indeksavimas visada prasideda nuo 0.
Kitas patogus viso masyvo inicijavimo būdas yra skliaustų pora, kaip parodyta žemiau.
var=( element1 element2 element3 . . . elementN )
Yra dar vienas būdas priskirti reikšmes masyvams. Šis inicializavimo būdas yra anksčiau paaiškinto metodo subkategorija.
array=( [XX]=<value> [XX]=<value> . . . )
Mes taip pat galime perskaityti/priskirti masyvo reikšmes vykdymo metu, naudodami įmontuotą read apvalkalą.
read -a array
Dabar vykdydamas pirmiau pateiktą teiginį scenarijuje, jis laukia kažkokio įvesties. Turime pateikti masyvo elementus, atskirtus tarpu (o ne vežimo grįžimą). Įvedę reikšmes, paspauskite Enter, kad baigtumėte.
Norėdami pereiti per masyvo elementus, mes taip pat galime naudoti kilpą.
for i in “${array[@]}” do #access each element as $i. . . done
Šis scenarijus apibendrina šio konkretaus skyriaus turinį.
#!/bin/bash array1[0]=one array1[1]=1 echo ${array1[0]} echo ${array1[1]} array2=( one two three ) echo ${array2[0]} echo ${array2[2]} array3=( [9]=nine [11]=11 ) echo ${array3[9]} echo ${array3[11]} read -a array4 for i in "${array4[@]}" do echo $i done exit 0
Daugelis standartinių styginių operacijų veikia masyvuose. Peržiūrėkite šį scenarijaus pavyzdį, kuris įgyvendina kai kurias masyvo operacijas (įskaitant eilutės operacijas).
#!/bin/bash array=( apple bat cat dog elephant frog ) #print first element echo ${array[0]} echo ${array:0} #display all elements echo ${array[@]} echo ${array[@]:0} #display all elements except first one echo ${array[@]:1} #display elements in a range echo ${array[@]:1:4} #length of first element echo ${#array[0]} echo ${#array} #number of elements echo ${#array[*]} echo ${#array[@]} #replacing substring echo ${array[@]//a/A} exit 0
Toliau pateikiama išvestis, sukurta vykdant aukščiau pateiktą scenarijų.
apple apple apple bat cat dog elephant frog apple bat cat dog elephant frog bat cat dog elephant frog bat cat dog elephant 5 5 6 6 Apple bAt cAt dog elephAnt frog
Manau, kad nėra prasmės išsamiai paaiškinti pirmiau pateiktą scenarijų, nes tai savaime suprantama. Jei reikia, vieną šios serijos dalį skirsiu tik manipuliacijoms stygomis.
Komandos pakeitimas priskiria komandos ar kelių komandų išvestį į kitą kontekstą. Čia šiame masyvų kontekste galime įterpti komandų išvestį kaip atskirus masyvų elementus. Sintaksė yra tokia.
array=( $(command) )
Pagal numatytuosius nustatymus komandos išvesties turinys, atskirtas tarpais, yra prijungtas prie masyvo kaip atskiri elementai. Šiame scenarijuje pateikiamas katalogo, kuris yra failai, turintys 755 teises, turinys.
#!/bin/bash ERR=27 EXT=0 if [ $# -ne 1 ]; then echo "Usage: $0 <path>" exit $ERR fi if [ ! -d $1 ]; then echo "Directory $1 doesn't exists" exit $ERR fi temp=( $(find $1 -maxdepth 1 -type f) ) for i in "${temp[@]}" do perm=$(ls -l $i) if [ `expr ${perm:0:10} : "-rwxr-xr-x"` -eq 10 ]; then echo ${i##*/} fi done exit $EXT
2 matmenų matricą galime lengvai pavaizduoti naudodami 1 dimensijų masyvą. eilės pagrindinės eilės vaizdavimo elementai kiekvienoje matricos eilėje nuosekliai saugomi masyvo indeksuose. MXn matricai formulę galima parašyti kaip.
matrix[i][j]=array[n*i+j]
Pažvelkite į kitą scenarijaus pavyzdį, kad pridėtumėte 2 matricas ir gautą matricą atspausdintumėte.
#!/bin/bash read -p "Enter the matrix order [mxn] : " t m=${t:0:1} n=${t:2:1} echo "Enter the elements for first matrix" for i in `seq 0 $(($m-1))` do for j in `seq 0 $(($n-1))` do read x[$(($n*$i+$j))] done done echo "Enter the elements for second matrix" for i in `seq 0 $(($m-1))` do for j in `seq 0 $(($n-1))` do read y[$(($n*$i+$j))] z[$(($n*$i+$j))]=$((${x[$(($n*$i+$j))]}+${y[$(($n*$i+$j))]})) done done echo "Matrix after addition is" for i in `seq 0 $(($m-1))` do for j in `seq 0 $(($n-1))` do echo -ne "${z[$(($n*$i+$j))]}\t" done echo -e "\n" done exit 0
Nors yra apribojimų, susijusių su masyvų naudojimu apvalkalo scenarijuose, jis tampa naudingas keliose situacijose, ypač kai mes dirbame su komandos pakeitimu. Žvelgiant administraciniu požiūriu, masyvų koncepcija atvėrė kelią daugelio foninių scenarijų kūrimui GNU/Linux sistemose.