Linux Shell Scripting-de massiwler bilen işlemek - 8-nji bölüm


Programma dilini massiw düşünjesi bolmazdan göz öňüne getirip bilmeris. Dürli dilleriň arasynda nähili durmuşa geçirilýändigi möhüm däl. Munuň ýerine massiwler, simwoliki at bilen meňzeş ýa-da başga maglumatlary birleşdirmäge kömek edýär.

Bu ýerde gabyk skriptleri bilen gyzyklananymyzda, bu makala size bu massiw düşünjesini ulanýan käbir gabyk skriptleri bilen oýnamaga kömek eder.

Array başlangyjy we ulanylyşy

Başyň täze wersiýalary bilen bir ölçegli massiwleri goldaýar. Bir massiw yglan gabygy bilen aç-açan yglan edilip bilner.

declare -a var  

Emma ýokarda görkezilişi ýaly massiw üýtgeýjilerini yglan etmek hökman däl. Göni aşakdaky ýaly tertipleşdirmek üçin aýratyn elementleri goýup bileris.

var[XX]=<value>

bu ýerde “XX” massiw indeksini aňladýar. Aralyk elementlerini kesgitlemek üçin egri ýaýyň sintaksisini ulanyň.

${var[XX]}

Bellik: Array indeksirlemek elmydama 0 bilen başlaýar.

Tutuş bir massiwiň başlamagynyň başga bir amatly usuly, aşakda görkezilişi ýaly jübüt jübüt ulanmakdyr.

var=( element1 element2 element3 . . . elementN )

Toplumlara bahalary bellemegiň başga bir usuly bar. Bu başlangyç usuly, öň düşündirilen usulyň kiçi kategoriýasydyr.

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

Şeýle hem, ýerine ýetiriş wagtynda okamak gabykdan ýasalan bahalary ulanyp, bahalary okap/belläp bileris.

read -a array

Indi ýokardaky jümläni skriptiň içinde ýerine ýetirensoň, käbir girişlere garaşýar. Kosmos bilen bölünen massiw elementlerini üpjün etmeli (we wagonyň gaýdyp gelmegi däl). Gymmatlyklary girizeniňizden soň gutarmak üçin Enter basyň.

Toplum elementlerinden geçmek üçin aýlaw üçin hem ulanyp bileris.

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

Aşakdaky ýazgy bu aýratyn bölümiň mazmunyny jemleýär.

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

Adaty setir amallarynyň köpüsi massiwlerde işleýär. Toplumdaky käbir amallary (setir amallaryny goşmak bilen) ýerine ýetirýän aşakdaky nusga skriptine serediň.

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

Aşakdaky ýokardaky skripti ýerine ýetirmekde öndürilen çykyş.

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

Aboveokardaky ýazgyny öz-özünden düşündirýänligi üçin jikme-jik düşündirmegiň manysy ýok diýip pikir edýärin. Zerur bolsa, bu seriýanyň bir bölegini diňe simli manipulýasiýa bagyşlaryn.

Buýrugy çalyşmak buýrugyň ýa-da birnäçe buýrugyň çykyşyny başga bir kontekstde belleýär. Bu ýerde massiwleriň çäginde buýruklaryň çykyşyny massiwleriň aýry elementleri hökmünde goýup bileris. Sintaksis aşakdaky ýaly.

array=( $(command) )

Düzgüne görä, ak boşluklar bilen bölünen buýruk çykyşynyň mazmuny aýratyn elementler hökmünde massiwde birikdirilýär. Aşakdaky skript, 755 rugsatly faýl bolan katalogyň mazmunyny görkezýär.

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

1 ölçegli massiw ulanyp, 2 ölçegli matrisany aňsatlyk bilen görkezip bileris. hatar esasy tertipde matrisanyň her hataryndaky şekillendiriş elementleri yzygiderli tertipde massiw indekslerinde saklanýar. MXn matrisa üçin edil şonuň ýaly formula ýazylyp bilner.

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

2 matrisa goşmak we netijede matrisany çap etmek üçin başga bir nusga skriptine serediň.

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

Gabyk skriptiniň içindäki massiwleri amala aşyrmak üçin çäklendirmeler bar bolsa-da, az sanly ýagdaýlarda peýdaly bolýar, esasanam buýruk çalyşmagy bilen iş salyşanymyzda. Administratiw nukdaýnazardan seretseň, massiwler düşünjesi GNU/Linux ulgamlarynda köp fon skriptleriniň ösmegine ýol açdy.