Työskentely taulukoiden kanssa Linuxin Shell-komentosarjassa – Osa 8
Emme voi kuvitella ohjelmointikieltä ilman taulukoiden käsitettä. Ei ole väliä, kuinka ne toteutetaan eri kielillä. Sen sijaan taulukot auttavat meitä yhdistämään samankaltaisia tai erilaisia tietoja yhden symbolisen nimen alle.
Koska olemme huolissamme shell-komentosarjoista, tämä artikkeli auttaa sinua leikkimään joidenkin komentotulkkikomentosarjojen kanssa, jotka käyttävät tätä taulukoiden käsitettä.
Taulukon alustus ja käyttö
Bashin uudemmissa versioissa se tukee yksiulotteisia taulukoita. Matriisi voidaan ilmoittaa eksplisiittisesti declare -kuoren avulla.
declare -a var
Mutta taulukkomuuttujia ei tarvitse ilmoittaa kuten edellä. Voimme lisätä yksittäisiä elementtejä taulukkoon suoraan seuraavasti.
var[XX]=<value>
jossa "XX" tarkoittaa taulukon indeksiä. Matriisielementtien viittausten poistamiseen käytetään kiharahakasulkeista syntaksia, ts.
${var[XX]}
Huomaa: taulukon indeksointi alkaa aina nollasta.
Toinen kätevä tapa alustaa koko taulukko on käyttää sulkuparia alla esitetyllä tavalla.
var=( element1 element2 element3 . . . elementN )
On vielä toinen tapa määrittää arvoja taulukoille. Tämä alustustapa on edellä selitetyn menetelmän alaluokka.
array=( [XX]=<value> [XX]=<value> . . . )
Voimme myös lukea/määrittää arvoja taulukolle suoritusajan aikana käyttämällä read -komentoa.
read -a array
Nyt kun yllä oleva lauseke suoritetaan skriptin sisällä, se odottaa syötettä. Meidän on annettava taulukon elementit välilyönnillä erotettuina (eikä vaunun palautus). Kun olet syöttänyt arvot, paina enteriä lopettaaksesi.
Matriisielementtien läpi kulkemiseen voimme käyttää myös for loop -ohjelmaa.
for i in “${array[@]}”
do
#access each element as $i. . .
done
Seuraavassa skriptissä on yhteenveto tämän osion sisällöstä.
#!/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
Erilaisia operaatioita taulukoille
Monet vakiomerkkijonotoiminnot toimivat taulukoissa. Katso seuraavaa esimerkkiskriptiä, joka toteuttaa joitain toimintoja taulukoille (mukaan lukien merkkijonotoiminnot).
#!/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
Seuraava on tulos, joka on tuotettu suoritettaessa yllä olevaa skriptiä.
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
Mielestäni ei ole merkitystä selittää yllä olevaa käsikirjoitusta yksityiskohtaisesti, koska se on itsestään selvä. Tarvittaessa omistan yhden osan tästä sarjasta yksinomaan jousimanipulaatioille.
Komento korvaaminen taulukoilla
Komennon korvaaminen määrittää komennon tai useiden komentojen lähdön toiseen kontekstiin. Tässä taulukoiden yhteydessä voimme lisätä komentojen tulosteet taulukoiden yksittäisinä elementteinä. Syntaksi on seuraava.
array=( $(command) )
Oletuksena välilyönnillä eroteltu komennon tulosteen sisältö liitetään taulukkoon yksittäisinä elementteinä. Seuraavassa komentosarjassa luetellaan hakemiston sisältö, joka on tiedostoja, joilla on 755 käyttöoikeutta.
#!/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
Kaksiulotteisten taulukoiden simulointi
Voimme helposti esittää 2-ulotteisen matriisin käyttämällä 1-ulotteista taulukkoa. Rivin pääjärjestyksessä matriisin kunkin rivin esityselementit tallennetaan asteittain taulukon indekseihin peräkkäin. mXn-matriisille saman kaava voidaan kirjoittaa muodossa.
matrix[i][j]=array[n*i+j]
Katso toista esimerkkiskriptiä 2 matriisin lisäämiseksi ja tuloksena olevan matriisin tulostamiseksi.
#!/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
Vaikka taulukoiden toteuttamisessa shell-skriptien sisällä on rajoituksia, siitä tulee hyödyllistä useissa tilanteissa, varsinkin kun käsittelemme komentojen korvaamista. Hallinnollisesta näkökulmasta katsottuna taulukoiden käsite tasoitti tietä monien taustaskriptien kehittämiselle GNU/Linux-järjestelmissä.