Schafft mat Arrays am Linux Shell Scripting - Deel 8


Mir kënnen eis eng Programméierungssprooch net virstellen ouni d'Konzept vun Arrays. Et ass egal wéi se tëscht verschiddene Sproochen ëmgesat ginn. Amplaz Arrays hëllefen eis Daten, ähnlech oder anescht, ënner engem symboleschen Numm ze konsolidéieren.

Hei wéi mir eis iwwer Shell-Skripten besuergt sinn, hëlleft dësen Artikel Iech mat e puer Shell-Skripte ze spillen, déi dëst Konzept vun Arrays benotzen.

Array Initialiséierung a Benotzung

Mat méi nei Versioune vu Bash ënnerstëtzt et eendimensional Arrays. En Array kann explizit vun der declare Shell-builtin deklaréiert ginn.

declare -a var  

Awer et ass net néideg Arrayvariablen ze deklaréieren wéi hei uewen. Mir kënnen eenzel Elementer direkt an d'Array setzen wéi follegt.

var[XX]=<value>

wou 'XX' den Arrayindex bezeechent. Fir d'Array-Elementer z'ënnerscheeden, benotzt d'Curly Bracket Syntax, d.h.

${var[XX]}

Notiz: Array Indexéierung fänkt ëmmer mat 0 un.

Eng aner praktesch Manéier fir e ganze Array z'initialiséieren ass andeems Dir d'Paarthese benotzt wéi hei ënnendrënner.

var=( element1 element2 element3 . . . elementN )

Et gëtt nach eng aner Manéier fir Wäerter un Arrays ze ginn. Dëse Wee vun der Initialiséierung ass eng Ënnerkategorie vun der virdru erkläerter Method.

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

Mir kënnen och Wäerter fir Array während der Ausféierungszäit liesen/zouzeweisen mat der read Shell-builtin.

read -a array

Elo wann Dir déi uewe genannte Ausso an engem Skript ausféiert, waart et op e puer Input. Mir mussen d'Array-Elementer ubidden, getrennt vum Raum (an net Kutsch zréck). Nodeems Dir d'Wäerter aginn hutt, dréckt Enter fir ofzeschléissen.

Fir duerch d'Array Elementer duerchzegoen, kënne mir och fir Loop benotzen.

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

Déi folgend Skript resüméiert den Inhalt vun dëser spezieller Sektioun.

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

Vill vun de Standard String Operatiounen funktionnéieren op Arrays. Kuckt de folgende Probeskript deen e puer Operatiounen op Arrays implementéiert (inklusiv Stringoperatiounen).

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

Folgend ass den Output produzéiert beim Ausféierung vum uewe genannte Skript.

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

Ech mengen et ass keng Bedeitung fir dat uewe genannte Skript am Detail z'erklären well et selbstänneg ass. Wann néideg wäert ech en Deel an dëser Serie exklusiv op Stringmanipulatiounen widmen.

Kommando Ersatz gëtt den Ausgang vun engem Kommando oder verschidde Kommandoen an en anere Kontext zou. Hei an dësem Kontext vun Arrays kënne mir den Ausgang vu Kommandoen als eenzel Elementer vun Arrays asetzen. Syntax ass wéi follegt.

array=( $(command) )

Par défaut sinn d'Inhalter an der Ausgab vum Kommando getrennt vu wäisse Plazen an d'Array als individuell Elementer ugeschloss. Déi folgend Skript lëscht den Inhalt vun engem Verzeechnes, dat sinn Dateien mat 755 Permissiounen.

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

Mir kënnen einfach eng 2-zweedimensional Matrix representéieren mat engem 1-zweedimensionalen Array. An Zeil Haaptuerdnung Representatiounselementer an all Zeil vun enger Matrix ginn progressiv an Array-Indexen op sequenziell Manéier gespäichert. Fir eng mXn Matrix, Formel fir déi selwecht kann geschriwwe ginn als.

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

Kuckt en anert Probeskript fir 2 Matrizen ze addéieren an déi resultéierend Matrix ze drécken.

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

Och wann et Aschränkungen fir d'Ëmsetzung vun Arrays am Shell-Skript ass, gëtt et an enger Handvoll Situatiounen nëtzlech, besonnesch wa mir mat Kommandosubstitutioun handelen. Aus enger administrativer Siicht kuckt, huet d'Konzept vun Arrays de Wee gemaach fir d'Entwécklung vu ville Background Scripten an GNU/Linux Systemer.