Rad s nizovima u Linux shell skriptovima – 8. dio


Ne možemo zamisliti programski jezik bez koncepta nizova. Nije bitno kako se implementiraju među različitim jezicima. Umjesto toga, nizovi nam pomažu u konsolidaciji podataka, sličnih ili različitih, pod jednim simboličkim imenom.

Budući da smo zabrinuti za shell skriptiranje, ovaj članak će vam pomoći da se poigrate s nekim shell skriptama koje koriste ovaj koncept nizova.

Inicijalizacija i upotreba niza

Sa novijim verzijama bash-a, podržava jednodimenzionalne nizove. Niz se može eksplicitno deklarisati pomoću declare shell-a.


declare -a var  

Ali nije potrebno deklarisati varijable niza kao gore. Možemo umetnuti pojedinačne elemente u niz direktno na sljedeći način.


var[XX]=<value>

gdje 'XX' označava indeks niza. Za dereferenciranje elemenata niza koristite sintaksu vitičastih zagrada, tj.


${var[XX]}

Napomena: Indeksiranje niza uvijek počinje s 0.

Još jedan zgodan način inicijalizacije cijelog niza je korištenje para zagrada kao što je prikazano ispod.


var=( element1 element2 element3 . . . elementN )

Postoji još jedan način dodjeljivanja vrijednosti nizovima. Ovaj način inicijalizacije je potkategorija prethodno objašnjene metode.


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

Također možemo čitati/dodijeliti vrijednosti nizu tokom vremena izvršavanja koristeći read shell-ugrađeni.


read -a array

Sada nakon izvršavanja gornje naredbe unutar skripte, ona čeka neki unos. Moramo da obezbedimo elemente niza razdvojene razmakom (a ne vraćanje nosača). Nakon unosa vrijednosti pritisnite enter za prekid.

Za kretanje kroz elemente niza možemo koristiti i for petlju.


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

Sljedeća skripta rezimira sadržaj ovog posebnog odjeljka.


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

Različite operacije nad nizovima

Mnoge od standardnih string operacija rade na nizovima. Pogledajte sljedeći primjer skripte koja implementira neke operacije nad nizovima (uključujući operacije sa stringovima).


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

Slijedi izlaz proizveden pri izvršavanju gornje skripte.


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

Mislim da nema smisla detaljno objašnjavati gornji skript jer je samo po sebi razumljivo. Po potrebi ću jedan dio u ovoj seriji posvetiti isključivo manipulacijama sa žicama.

Zamjena naredbi s nizovima

Zamjena naredbi dodjeljuje izlaz naredbe ili više naredbi u drugi kontekst. Ovdje u ovom kontekstu nizova možemo umetnuti izlaz naredbi kao pojedinačne elemente nizova. Sintaksa je sljedeća.


array=( $(command) )

Prema zadanim postavkama sadržaj u izlazu naredbe odvojen razmacima je uključen u niz kao pojedinačni elementi. Sljedeća skripta navodi sadržaj direktorija, koji su datoteke sa 755 dozvola.


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

Simulacija dvodimenzionalnih nizova

Lako možemo predstaviti 2-dimenzionalnu matricu koristeći 1-dimenzionalni niz. U glavnom redu reda elementi reprezentacije u svakom redu matrice se progresivno pohranjuju u indekse niza na sekvencijalni način. Za mXn matricu, formula za istu se može napisati kao.


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

Pogledajte drugi primjer skripte za dodavanje 2 matrice i ispis rezultirajuće 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 

Iako postoje ograničenja za implementaciju nizova unutar shell skriptiranja, to postaje korisno u nekoliko situacija, posebno kada se bavimo zamjenom naredbi. Gledajući sa administrativne tačke gledišta, koncept nizova je utro put za razvoj mnogih pozadinskih skripti u GNU/Linux sistemima.