Pagtrabaho kauban ang mga Array sa Linux Shell Scripting - Bahin 8


Dili nato mahanduraw ang usa ka programming language nga walay konsepto sa arrays. Dili igsapayan kung giunsa kini gipatuman sa lainlaing mga pinulongan. Hinuon ang mga arrays makatabang kanato sa pagkonsolida sa datos, susama o lahi, ubos sa usa ka simbolo nga ngalan.

Dinhi ingon nga kami nabalaka bahin sa shell scripting, kini nga artikulo makatabang kanimo sa pagdula-dula sa pipila ka mga script sa shell nga gigamit kini nga konsepto sa mga arrays.

Array Initialization ug Paggamit

Uban sa mas bag-ong mga bersyon sa bash, kini nagsuporta sa usa ka dimensyon nga arrays. Ang usa ka array mahimong dayag nga ipahayag pinaagi sa declare shell-builtin.

declare -a var  

Apan dili kinahanglan nga ipahayag ang mga variable sa array sama sa ibabaw. Mahimo natong isulod ang tagsa-tagsa nga mga elemento sa paghan-ay direkta sama sa mosunod.

var[XX]=<value>

diin ang 'XX' nagpasabot sa array index. Sa pag-dereference sa mga elemento sa array gamita ang curly bracket syntax, i.e.

${var[XX]}

Hinumdomi: Ang pag-indeks sa array kanunay magsugod sa 0.

Ang laing sayon nga paagi sa pagsugod sa tibuok nga array mao ang paggamit sa parisan sa parenthesis sama sa gipakita sa ubos.

var=( element1 element2 element3 . . . elementN )

Adunay usa pa ka paagi sa pag-assign sa mga kantidad sa mga arrays. Kini nga paagi sa pagsugod usa ka sub-kategorya sa gipasabut kaniadto nga pamaagi.

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

Mahimo usab natong basahon/ihatag ang mga bili sa array sa panahon sa pagpatuman gamit ang read shell-builtin.

read -a array

Karon sa pagpatuman sa pahayag sa ibabaw sa sulod sa usa ka script, naghulat kini sa pipila ka input. Kinahanglan namon nga ihatag ang mga elemento sa array nga gibulag sa wanang (ug dili pagbalik sa karwahe). Pagkahuman sa pagsulod sa mga kantidad ipadayon ang enter aron tapuson.

Sa paglatas sa mga elemento sa array mahimo usab natong gamiton alang sa loop.

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

Ang mosunod nga script nagsumaryo sa mga sulod niining partikular nga seksyon.

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

Daghan sa mga standard string operations nagtrabaho sa arrays. Tan-awa ang mosunod nga sampol nga script nga nagpatuman sa pipila ka mga operasyon sa mga arrays (lakip ang mga operasyon sa string).

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

Ang mosunod mao ang output nga gihimo sa pagpatuman sa script sa ibabaw.

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

Sa akong hunahuna walay kahulogan sa pagpatin-aw sa ibabaw sa script sa detalye ingon nga kini mao ang sa kaugalingon nga pagpatin-aw. Kung gikinahanglan akong ipahinungod ang usa ka bahin niini nga serye nga eksklusibo sa mga manipulasyon sa hilo.

Ang pag-ilis sa command nag-assign sa output sa usa ka command o daghang mga command ngadto sa laing konteksto. Dinhi niini nga konteksto sa mga arrays mahimo natong isulod ang output sa mga commands isip indibidwal nga mga elemento sa arrays. Ang syntax mao ang mosunod.

array=( $(command) )

Sa kasagaran ang mga sulod sa output sa command nga gibulag sa puti nga mga luna gisaksak sa array isip indibidwal nga mga elemento. Ang mosunud nga script naglista sa mga sulud sa usa ka direktoryo, nga mga file nga adunay 755 nga pagtugot.

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

Dali ra tang makarepresentar sa 2-dimensional nga matrix gamit ang 1-dimensional array. Sa row major order ang mga elemento sa representasyon sa matag laray sa usa ka matrix anam-anam nga gitipigan sa array index sa sunodsunod nga paagi. Alang sa usa ka mXn matrix, ang pormula alang sa parehas mahimong isulat ingon.

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

Tan-awa ang laing sample script para sa pagdugang og 2 ka matrice ug pag-imprinta sa resulta nga 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 

Bisan kung adunay mga limitasyon sa pag-implementar sa mga arrays sulod sa shell scripting, kini mahimong mapuslanon sa pipila ka mga sitwasyon, ilabi na kung kita magdumala uban sa command substitution. Sa pagtan-aw gikan sa usa ka administratibong punto sa panglantaw, ang konsepto sa mga arrays naghatag sa dalan alang sa pagpalambo sa daghang mga background script sa GNU/Linux system.