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ı.