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.