Kufanya kazi na Arrays katika Uandishi wa Shell ya Linux - Sehemu ya 8


Hatuwezi kufikiria lugha ya programu bila dhana ya safu. Haijalishi jinsi yanavyotekelezwa kati ya lugha mbalimbali. Badala yake safu hutusaidia katika kuunganisha data, sawa au tofauti, chini ya jina moja la ishara.

Hapa tunapojali uandishi wa ganda, nakala hii itakusaidia katika kucheza na maandishi kadhaa ya ganda ambayo hutumia wazo hili la safu.

Mkusanyiko wa Uanzishaji na Matumizi

Na matoleo mapya zaidi ya bash, inasaidia safu zenye mwelekeo mmoja. Mkusanyiko unaweza kutangazwa kwa uwazi na declare shell-builtin.

declare -a var  

Lakini sio lazima kutangaza anuwai za safu kama hapo juu. Tunaweza kuingiza vipengele vya kibinafsi ili kupanga moja kwa moja kama ifuatavyo.

var[XX]=<value>

ambapo 'XX' inaashiria faharisi ya safu. Ili kuacha vipengele vya safu tumia syntax ya mabano ya curly, i.e.

${var[XX]}

Kumbuka: Kuorodhesha kwa safu kila wakati huanza na 0.

Njia nyingine rahisi ya kuanzisha safu nzima ni kwa kutumia jozi ya mabano kama inavyoonyeshwa hapa chini.

var=( element1 element2 element3 . . . elementN )

Bado kuna njia nyingine ya kugawa maadili kwa safu. Njia hii ya uanzishaji ni kategoria ndogo ya njia iliyoelezewa hapo awali.

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

Tunaweza pia kusoma/kugawa maadili ili kupanga wakati wa utekelezaji kwa kutumia soma shell-builtin.

read -a array

Sasa juu ya kutekeleza taarifa hiyo hapo juu ndani ya hati, inangojea pembejeo fulani. Tunahitaji kutoa vipengele vya safu vilivyotenganishwa na nafasi (na sio kurudi kwa gari). Baada ya kuingiza maadili bonyeza enter ili kusitisha.

Kupitia vipengele vya safu tunaweza pia kutumia kwa kitanzi.

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

Hati ifuatayo ni muhtasari wa yaliyomo katika sehemu hii mahususi.

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

Uendeshaji mwingi wa kamba kawaida hufanya kazi kwenye safu. Angalia hati ifuatayo ya sampuli ambayo hutekelezea shughuli zingine kwenye safu (pamoja na shughuli za kamba).

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

Ifuatayo ni matokeo yanayotokana na kutekeleza hati iliyo hapo juu.

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

Nadhani hakuna umuhimu wa kuelezea maandishi hapo juu kwa undani kwani inajielezea. Ikibidi nitaweka wakfu sehemu moja katika mfululizo huu kwa upotoshaji wa kamba.

Ubadilishaji wa amri hupeana matokeo ya amri au amri nyingi katika muktadha mwingine. Hapa katika muktadha huu wa safu tunaweza kuingiza matokeo ya amri kama vipengele vya kibinafsi vya safu. Sintaksia ni kama ifuatavyo.

array=( $(command) )

Kwa chaguo-msingi yaliyomo katika matokeo ya amri yaliyotenganishwa na nafasi nyeupe yamechomekwa kwenye safu kama vipengele vya mtu binafsi. Hati ifuatayo inaorodhesha yaliyomo kwenye saraka, ambayo ni faili zilizo na ruhusa 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

Tunaweza kuwakilisha kwa urahisi matrix ya 2-dimensional kwa kutumia safu ya 1-dimensional. Katika mpangilio mkuu vipengele vya uwakilishi katika kila safu mlalo huhifadhiwa hatua kwa hatua katika faharasa za safu kwa mfuatano. Kwa matrix ya mXn, fomula ya hiyo hiyo inaweza kuandikwa kama.

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

Angalia hati nyingine ya sampuli ya kuongeza matiti 2 na uchapishaji wa matokeo.

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

Ingawa kuna vikwazo vya kutekeleza safu ndani ya uandishi wa ganda, inakuwa muhimu katika hali chache, haswa tunaposhughulikia kwa uingizwaji wa amri. Ukiangalia kutoka kwa mtazamo wa kiutawala, dhana ya safu ilifungua njia ya ukuzaji wa hati nyingi za usuli katika mifumo ya GNU/Linux.