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.