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.