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.