Vinna með fylki í Linux Shell Scripting - Hluti 8


Við getum ekki ímyndað okkur forritunarmál án hugmyndarinnar um fylki. Það skiptir ekki máli hvernig þau eru útfærð á ýmsum tungumálum. Þess í stað hjálpa fylki okkur við að sameina gögn, svipuð eða ólík, undir einu táknrænu nafni.

Hér, þar sem við höfum áhyggjur af skeljaforskriftum, mun þessi grein hjálpa þér að leika þér með nokkur skeljaforskrift sem nýta þessa hugmynd um fylki.

Fylkisuppstilling og notkun

Með nýrri útgáfum af bash styður það einvíddar fylki. Hægt er að lýsa yfir fylki með declare skelinni.

declare -a var  

En það er ekki nauðsynlegt að lýsa yfir fylkisbreytum eins og hér að ofan. Við getum sett einstaka þætti inn í fylki beint sem hér segir.

var[XX]=<value>

þar sem ‘XX’ táknar fylkisvísitöluna. Til að vísa til fylkisþátta, notaðu setningafræði með krulluðu sviganum, þ.e.

${var[XX]}

Athugið: Fylkisskráning byrjar alltaf á 0.

Önnur þægileg leið til að frumstilla heilt fylki er með því að nota svigaparið eins og sýnt er hér að neðan.

var=( element1 element2 element3 . . . elementN )

Það er enn önnur leið til að úthluta gildum til fylki. Þessi leið til frumstillingar er undirflokkur aðferðarinnar sem áður var útskýrð.

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

Við getum líka lesið/úthlutað gildum á fylki meðan á framkvæmdartímanum stendur með því að nota les skelinnbygginguna.

read -a array

Nú þegar ofangreind yfirlýsing er framkvæmd í handriti, bíður það eftir einhverju inntaki. Við þurfum að útvega fylkisþættina aðskilda með bili (en ekki vagnsskil). Eftir að hafa slegið inn gildin ýttu á enter til að hætta.

Til að fara í gegnum fylkisþættina getum við líka notað fyrir lykkju.

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

Eftirfarandi handrit dregur saman innihald þessa tiltekna hluta.

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

Margar af stöðluðum strengjaaðgerðum virka á fylki. Horfðu á eftirfarandi sýnishornsskrift sem útfærir nokkrar aðgerðir á fylki (þar á meðal strengjaaðgerðir).

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

Eftirfarandi er framleiðsla sem framleidd er við framkvæmd ofangreindra handrits.

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

Ég held að það sé engin þýðing að útskýra ofangreint handrit í smáatriðum þar sem það skýrir sig sjálft. Ef nauðsyn krefur mun ég tileinka einum hluta í þessari seríu eingöngu í strengjameðferð.

Skipun skipana úthlutar úttak skipunar eða margra skipana í annað samhengi. Hér í þessu samhengi fylkinga getum við sett inn úttak skipana sem einstaka þætti fylki. Setningafræði er sem hér segir.

array=( $(command) )

Sjálfgefið er að innihald í úttak skipunarinnar aðskilið með hvítum reitum er tengt við fylki sem einstakir þættir. Eftirfarandi forskrift sýnir innihald möppu, sem eru skrár með 755 heimildir.

#!/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ð getum auðveldlega táknað tvívítt fylki með því að nota einvíddar fylki. Í röð aðalröð eru framsetningareiningar í hverri röð fylkis geymdar smám saman í fylkisvísitölum í röð. Fyrir mXn fylki er hægt að skrifa formúlu fyrir það sama sem.

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

Horfðu á annað sýnishorn til að bæta við 2 fylkjum og prenta fylkið sem myndast.

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

Jafnvel þó að það séu takmarkanir á því að útfæra fylki innan skeljaforskrifta, þá verður það gagnlegt í handfylli af aðstæðum, sérstaklega þegar við tökumst á við skipanaskipti. Þegar litið er út frá stjórnsýslulegu sjónarmiði ruddi hugmyndin um fylki brautina fyrir þróun margra bakgrunnsskrifta í GNU/Linux kerfum.