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.