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ä.