Delo z nizi v Linux Shell Scripting - 8. del


Programskega jezika si ne moremo predstavljati brez koncepta nizov. Ni pomembno, kako se izvajajo med različnimi jeziki. Namesto tega nam nizi pomagajo pri združevanju podobnih ali drugačnih podatkov pod enim simboličnim imenom.

Ker nas tukaj skrbi skript lupine, vam bo ta članek pomagal pri igranju z nekaterimi lupinskimi skripti, ki uporabljajo ta koncept nizov.

Inicializacija in uporaba matrike

Z novejšimi različicami bash podpira enodimenzionalne nize. Niz lahko izrecno deklarira ukaz z vgrajeno lupino.

declare -a var  

Vendar ni treba navesti spremenljivk matrike, kot je navedeno zgoraj. Posamezne elemente lahko v matriko vstavimo neposredno, kot sledi.

var[XX]=<value>

kjer 'XX' pomeni indeks matrike. Za razporejanje elementov matrike uporabite sintakso kodrastih oklepajev, tj.

${var[XX]}

Opomba: Indeksiranje matrike se vedno začne z 0.

Drug priročen način inicializacije celotnega polja je uporaba para oklepajev, kot je prikazano spodaj.

var=( element1 element2 element3 . . . elementN )

Obstaja še en način dodeljevanja vrednosti nizom. Ta način inicializacije je podkategorija predhodno razložene metode.

array=( [XX]=<value> [XX]=<value> . . . )

V času izvajanja lahko tudi beremo/dodeljujemo vrednosti v matriko z branje v lupino.

read -a array

Zdaj po izvedbi zgornje izjave znotraj skripta počaka na nekaj vnosa. Navesti moramo matrične elemente, ločene s presledkom (in ne vrnitvijo nosilca). Po vnosu vrednosti pritisnite enter, da končate.

Za prehod skozi elemente polja lahko uporabimo tudi for loop.

for i in “${array[@]}”
do
	#access each element as $i. . .
done 

Naslednji skript povzema vsebino tega poglavja.

#!/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

Številne standardne operacije nizov delujejo na nizih. Oglejte si naslednji vzorčni skript, ki izvaja nekatere operacije nad nizi (vključno z nizovnimi operacijami).

#!/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

Sledi rezultat, ki je nastal pri izvajanju zgornjega skripta.

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

Menim, da pri podrobni razlagi zgornjega scenarija ni nobenega pomena, saj je sam po sebi razumljiv. Po potrebi bom en del v tej seriji posvetil izključno manipulacijam z vrvicami.

Nadomeščanje ukazov dodeli izhod ukaza ali več ukazov v drug kontekst. Tu v tem kontekstu nizov lahko vstavimo izhod ukazov kot posamezne elemente nizov. Sintaksa je naslednja.

array=( $(command) )

Vsebina v izhodu ukaza, ločena s presledki, je privzeto vključena v matriko kot posamezni elementi. Naslednji skript vsebuje vsebino imenika, to so datoteke s 755 dovoljenji.

#!/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

Dvodimenzionalno matriko lahko enostavno predstavimo z uporabo enodimenzionalnega polja. V vrstici velikega vrstnega reda se elementi predstavitve v vsaki vrstici matrike zaporedno shranijo v indekse matrike. Za matriko mXn lahko formulo za isto napišemo kot.

matrix[i][j]=array[n*i+j]

Oglejte si še en vzorčni skript za dodajanje 2 matric in tiskanje nastale matrice.

#!/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 

Čeprav obstajajo omejitve za izvajanje nizov znotraj skriptov lupine, je to koristno v peščici situacij, zlasti kadar ravnamo z zamenjavo ukazov. Z upravnega vidika je koncept nizov odprl pot razvoju številnih skriptov v ozadju v sistemih GNU/Linux.