Linux Kabuk Komut Dosyasında Dizilerle Çalışmak – Bölüm 8


Dizi kavramı olmadan bir programlama dili düşünemiyoruz. Çeşitli diller arasında nasıl uygulandıkları önemli değildir. Bunun yerine diziler, benzer veya farklı verileri tek bir sembolik ad altında birleştirmemize yardımcı olur.

Burada kabuk komut dosyası oluşturmayla ilgilendiğimiz için bu makale, bu dizi kavramını kullanan bazı kabuk komut dosyalarıyla denemeler yapmanıza yardımcı olacaktır.

Dizi Başlatma ve Kullanımı

Bash'ın daha yeni sürümleriyle tek boyutlu dizileri destekler. Bir dizi açıkça declare kabuk yapısı tarafından bildirilebilir.


declare -a var  

Ancak dizi değişkenlerini yukarıdaki gibi bildirmek gerekli değildir. Bireysel elemanları doğrudan aşağıdaki gibi diziye ekleyebiliriz.


var[XX]=<value>

burada 'XX' dizi indeksini belirtir. Dizi elemanlarının referansını kaldırmak için süslü parantez sözdizimini kullanın;


${var[XX]}

Not: Dizi indeksleme her zaman 0 ile başlar.

Bir dizinin tamamını başlatmanın başka bir uygun yolu, aşağıda gösterildiği gibi parantez çiftini kullanmaktır.


var=( element1 element2 element3 . . . elementN )

Dizilere değer atamanın başka bir yolu daha vardır. Bu başlatma yöntemi, daha önce açıklanan yöntemin bir alt kategorisidir.


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

Ayrıca read kabuk yerleşikini kullanarak yürütme süresi boyunca diziye değerler okuyabilir/atayabiliriz.


read -a array

Şimdi yukarıdaki ifadeyi bir komut dosyasında çalıştırdıktan sonra, bir miktar girdi bekler. Dizi elemanlarını boşlukla ayırarak (satır başıyla değil) sağlamamız gerekiyor. Değerleri girdikten sonra sonlandırmak için enter tuşuna basın.

Dizi elemanları arasında geçiş yapmak için for döngüsünü de kullanabiliriz.


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

Aşağıdaki komut dosyası bu özel bölümün içeriğini özetlemektedir.


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

Dizilerde Çeşitli İşlemler

Standart dize işlemlerinin çoğu diziler üzerinde çalışır. Dizilerde bazı işlemleri (dize işlemleri dahil) uygulayan aşağıdaki örnek komut dosyasına bakın.


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

Yukarıdaki betiğin çalıştırılmasıyla elde edilen çıktı aşağıdadır.


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

Yukarıdaki senaryoyu kendi kendini açıklayıcı olduğu için ayrıntılı olarak açıklamanın bir anlamı olmadığını düşünüyorum. Gerekirse bu serinin bir bölümünü yalnızca tel manipülasyonlarına ayıracağım.

Dizilerle Komut Değiştirme

Komut ikamesi, bir komutun veya birden fazla komutun çıktısını başka bir bağlama atar. Burada, dizilerin bu bağlamında, komutların çıktısını dizilerin ayrı ayrı öğeleri olarak ekleyebiliriz. Sözdizimi aşağıdaki gibidir.


array=( $(command) )

Varsayılan olarak komut çıktısındaki beyaz boşluklarla ayrılmış içerikler diziye ayrı öğeler olarak eklenir. Aşağıdaki komut dosyası, 755 izne sahip dosyalar olan bir dizinin içeriğini listeler.


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

İki Boyutlu Dizilerin Simülasyonu

1 boyutlu bir dizi kullanarak 2 boyutlu bir matrisi kolaylıkla temsil edebiliriz. Bir matrisin her satırındaki satır ana düzeni temsil öğeleri, dizi indekslerinde sıralı bir şekilde aşamalı olarak depolanır. Bir mXn matrisi için formül şu şekilde yazılabilir.


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

2 matris eklemek ve elde edilen matrisi yazdırmak için başka bir örnek komut dosyasına bakın.


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

Kabuk komut dosyası oluşturmada dizilerin uygulanmasına ilişkin sınırlamalar olsa da, bazı durumlarda, özellikle de komut değiştirmeyle uğraştığımızda yararlı olur. Yönetimsel açıdan bakıldığında dizi kavramı, GNU/Linux sistemlerinde birçok arka plan komut dosyasının geliştirilmesinin yolunu açtı.