Arbejde med arrays i Linux Shell Scripting - Del 8


Vi kan ikke forestille os et programmeringssprog uden begrebet arrays. Det betyder ikke noget, hvordan de implementeres på forskellige sprog. I stedet hjælper arrays os med at konsolidere data, ens eller forskellige, under et symbolsk navn.

Her, da vi er bekymrede for shell-scripting, vil denne artikel hjælpe dig med at lege med nogle shell-scripts, der gør brug af dette koncept med arrays.

Initialisering og brug af matrix

Med nyere versioner af bash understøtter den endimensionale arrays. En matrix kan eksplicit erklæres af erklær shell-indbygget.

declare -a var  

Men det er ikke nødvendigt at erklære arrayvariabler som ovenfor. Vi kan indsætte individuelle elementer for at oprette direkte som følger.

var[XX]=<value>

hvor 'XX' angiver matrixindekset. For at afvige arrayelementer skal du bruge den krøllede parentes-syntaks, dvs.

${var[XX]}

Bemærk: Arrayindeksering starter altid med 0.

En anden praktisk måde at initialisere et helt array er ved hjælp af parantesparret som vist nedenfor.

var=( element1 element2 element3 . . . elementN )

Der er endnu en måde at tildele værdier til arrays. Denne måde til initialisering er en underkategori af den tidligere forklarede metode.

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

Vi kan også læse/tildele værdier til array i løbet af udførelsestiden ved hjælp af læse shell-indbygget.

read -a array

Nu efter at have udført ovenstående erklæring inde i et script, venter det på noget input. Vi er nødt til at give arrayelementerne adskilt af mellemrum (og ikke vognretur). Efter indtastning af værdierne skal du trykke på enter for at afslutte.

For at krydse gennem matrixelementerne kan vi også bruge til loop.

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

Følgende script opsummerer indholdet af dette afsnit.

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

Mange af standardstrengoperationer fungerer på arrays. Se på følgende eksempelscript, der implementerer nogle operationer på arrays (inklusive strengoperationer).

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

Følgende er output produceret ved udførelse af ovenstående script.

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

Jeg tror, der er ingen betydning i at forklare ovenstående script i detaljer, da det er selvforklarende. Om nødvendigt vil jeg dedikere en del i denne serie udelukkende til strengmanipulationer.

Kommandosubstitution tildeler output fra en kommando eller flere kommandoer i en anden sammenhæng. Her i denne sammenhæng med arrays kan vi indsætte output af kommandoer som individuelle elementer i arrays. Syntaks er som følger.

array=( $(command) )

Som standard er indholdet i output af kommando adskilt af hvide mellemrum tilsluttet array som individuelle elementer. Følgende script viser indholdet af en mappe, der er filer med 755 tilladelser.

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

Vi kan let repræsentere en 2-dimensionel matrix ved hjælp af et 1-dimensionelt array. I række større rækkefølge repræsentationselementer i hver række i en matrix lagres gradvist i matrixindekser på en sekventiel måde. For en mXn-matrix kan formel for det samme skrives som.

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

Se på et andet eksempelscript for at tilføje 2 matricer og udskrive den resulterende matrix.

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

Selvom der er begrænsninger for implementering af arrays i shell-scripting, bliver det nyttigt i en håndfuld situationer, især når vi håndterer kommandosubstitution. Set fra et administrativt synspunkt banede begrebet arrays vejen for udvikling af mange baggrundsskripter i GNU/Linux-systemer.