Rad s nizovima u Linux shell skriptiranju – 8. dio
Ne možemo zamisliti programski jezik bez pojma nizova. Nije važno 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čnim imenom.
Budući da smo zabrinuti oko skriptiranja ljuske, ovaj će vam članak pomoći da se poigrate s nekim skriptama ljuske koje koriste ovaj koncept nizova.
Inicijalizacija niza i korištenje
S novijim verzijama bash-a podržava jednodimenzionalne nizove. Niz se može eksplicitno deklarirati pomoću declare ugrađene ljuske.
declare -a var
Ali nije potrebno deklarirati varijable polja kao gore. Pojedinačne elemente možemo izravno umetnuti u niz kako slijedi.
var[XX]=<value>
gdje 'XX' označava indeks niza. Za dereferenciranje elemenata polja koristite sintaksu vitičastih zagrada, tj.
${var[XX]}
Napomena: Indeksiranje polja uvijek počinje s 0.
Još jedan prikladan način inicijalizacije cijelog niza je korištenje para zagrada kao što je prikazano u nastavku.
var=( element1 element2 element3 . . . elementN )
Postoji još jedan način dodjele vrijednosti nizovima. Ovaj način inicijalizacije je podkategorija prethodno objašnjene metode.
array=( [XX]=<value> [XX]=<value> . . . )
Također možemo čitati/dodijeliti vrijednosti nizu tijekom vremena izvođenja pomoću čitanja ugrađene ljuske.
read -a array
Nakon izvršavanja gornje naredbe unutar skripte, čeka se neki unos. Moramo osigurati elemente niza odvojene razmakom (a ne povratak na početak reda). Nakon unosa vrijednosti pritisnite enter za prekid.
Za kretanje kroz elemente niza također možemo koristiti for petlju.
for i in “${array[@]}”
do
#access each element as $i. . .
done
Sljedeća skripta sažima sadržaj ovog određenog 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
Razne operacije nad nizovima
Mnoge standardne operacije nizova rade na nizovima. Pogledajte sljedeći primjer skripte koji implementira neke operacije na nizovima (uključujući operacije nizova).
#!/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 koji se dobije prilikom izvršavanja 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 gornju skriptu jer je sama po sebi razumljiva. Ako bude potrebno, posvetit ću jedan dio u ovoj seriji isključivo manipulacijama ž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žaji u izlazu naredbe odvojeni razmacima uključeni su u niz kao pojedinačni elementi. Sljedeća skripta ispisuje sadržaj direktorija, a to su datoteke s dopuštenjima 755.
#!/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 pomoću 1-dimenzionalnog niza. U glavnom redoslijedu retka elementi reprezentacije u svakom retku matrice postupno se pohranjuju u indekse polja na sekvencijalan način. Za mXn matricu, formula za istu može se napisati kao.
matrix[i][j]=array[n*i+j]
Pogledajte još jedan primjer skripte za zbrajanje 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 skriptiranja ljuske, ono postaje korisno u nekolicini situacija, posebno kada se nosimo sa zamjenom naredbi. Gledajući s administrativne točke gledišta, koncept nizova otvorio je put za razvoj mnogih pozadinskih skripti u GNU/Linux sustavima.