BMS-301 Kabuk Programlama Güz 2017 (7. Sunu) (Yrd. Doç. Dr. Deniz Dal)
Bu sunu aşağıdaki link kullanılarak hazırlanmıştır. http://www.thegeekstuff.com/2010/06/bash-array-tutorial/
Dizi Genellikle aynı türde (bazen farklı türde) birden fazla veriyi saklamak amacıyla kullanılan en temel veri yapısına dizi denir. Bash kabuğu programlamada: dizilerin boyutları ile ilgili bir maksimum kısıtlaması yoktur. dizi üyeleri ardışıl olarak oluşturulmak veya indekslenmek zorunda değildir. dizi indisi 0’dan başlar.
Dizi Deklarasyonu ve Dizi Elemanlarına İndeks (İndis) Kullanılarak Değer Atama Aşağıdaki kullanım Bash kabuğu programlamada bir dizinin otomatik olarak oluşturulmasını sağlar. name[index]=value; Bu kullanımda name dizinin adıdır. index ise değeri sıfıra eşit veya sıfırdan büyük bir tam sayı ve deyim olabilir. Dizi elemanlarına index sayesinde ulaşılır ve index kare parantezler arasına alınır.
Dizi Elemanlarına İndeks Kullanarak Ulaşım $ cat ArrayManip.sh #!/bin/bash Linux[0]="Debian"; Linux[1]="Red Hat"; Linux[2]="Ubuntu"; Linux[3]="Suse"; Linux[4]="Fedora"; echo ${Linux[1]}; #Dizi Elemanına İndeks İle Ulaşmak İçin echo $Linux; #echo ${Linux}; #İndex Belirtilmezse $./ArrayManip.sh Red Hat Debian
Dizi Deklarasyonu Anında Dizi Elemanlarına İlk Değer Atama Her bir dizi elemanını indeks kullanarak tek tek oluşturmak yerine, bir Bash dizisi deklarasyon anında ilk değer atama listesi kullanılarak da oluşturulabilir. Bu amaçla normal parantezler kullanılır ve dizi elemanları birbirlerinden en az bir boşluk karakteri ile ayrılır. Bir dizi elemanının boşluk karakteri içermesi durumunda ilgili dizi elemanı tırnak içerisine alınmalıdır. $ Linux=("Debian" "Red Hat" "Ubuntu" "Suse" "Fedora"); $ echo ${Linux[1]}; Red Hat
Boş Dizi Deklarasyonu $ Linux=();
Bir Dizinin Tamamına Ulaşım İndeks numarası olarak @ karakteri kullanılarak bir dizinin tamamına ulaşılabilir. (Bu işlem bir dizinin elemanlarını bir döngü ile ziyaret edebilmek amacıyla sıklıkla kullanılır.) $ Linux=("Debian" "Red Hat" "Ubuntu" "Suse" "Fedora"); $ echo ${Linux[@]}; Debian Red Hat Ubuntu Suse Fedora
Bir Dizinin Eleman Sayısı (Boyutu) $ Linux=("Debian" "Red Hat" "Ubuntu" "Suse" "Fedora"); $ echo ${#Linux[@]}; 5
Bir Dizinin n. İndisindeki Elemanının Boyutu $ Linux=("Debian" "Red Hat" "Ubuntu" "Suse" "Fedora"); $ echo ${#Linux[2]}; #İndeks 2’de bulunan dizi elemanının boyutu 6
Bir Dizinin Belirli Bir İndis Aralığındaki Elemanlarına Ulaşım $ Linux=("Debian" "Red Hat" "Ubuntu" "Suse" "Fedora"); $ echo ${Linux[@]:3:2}; #3. ve 4. indekslerdeki elemanlar Suse Fedora $ echo ${Linux[@]:0}; ?? $ echo ${Linux[@]:3};
Bir Dizinin Belirli Bir Elemanının Belirli Bir Aralıktaki Elemanlarına Ulaşım $ Linux=("Debian" "Red Hat" "Ubuntu" "Suse" "Fedora"); $ echo ${Linux[2]:0:4}; #2. indeksteki elemanın ilk 4 karakteri Ubun
Mevcut Bir Dizinin Sonuna Yeni Bir Dizi Elemanı Ekleme $ Linux=("Debian" "Red Hat" "Ubuntu" "Suse" "Fedora"); $ Linux=("${Linux[@]}" "Knoppix"); $ echo ${Linux[5]}; Knoppix $ echo ${#Linux[@]}; 6 $ Linux=(${Linux[@]} "Knoppix"); $ echo ${# Linux[@]}; 7 Orijinal dizi çift tırnak içerisine alınmazsa, içinde boşluk karakteri bulunan dizi elemanları aynen muhafaza edilmezler. If the elements in your array could contain whitespace, you need to use double quotes so that each element is treated as a separate "word:" foo=("the first" "the second") for i in "${foo[@]}"; do # Expands to 'for i in "the first" "the second"; do...' echo $i # so the loop runs twice done # the first # the second Contrast this with the behavior without double quotes: for i in ${foo[@]}; do # Expands to 'for i in the first the second; do...' echo $i # so the loop runs four times! # the # first # second
Mevcut Bir Dizinin Sonuna Yeni Bir Dizi Elemanı Ekleme $ Linux+=("Kali Linux"); veya $ Linux[${#Linux[@]}]="Knoppix";
Mevcut Bir Dizinin Başına Yeni Bir Dizi Elemanı Ekleme $ Linux=("Debian" "Red Hat" "Ubuntu" "Suse" "Fedora"); $ Linux=("Kali Linux" "${Linux[@]}"); $ echo ${Linux[@]}; Kali Linux Debian Red Hat Ubuntu Suse Fedora Çift tırnak kullanılmasaydı ne olurdu? Çift tırnağın kullanılması ve kullanılmaması durumlarında dizinin boyutlarını test ediniz.
Bir Dizi Elemanının Silinmesi Çift tırnak kullanılmasaydı ne olurdu? Çift tırnağın kullanılması ve kullanılmaması durumlarında dizinin boyutlarını test ediniz. $ cat ArrayManip.sh #!/bin/bash Linux=("Debian" "Red Hat" "Ubuntu" "Suse" "Fedora"); pos=3; Linux=("${Linux[@]:0:$pos}" "${Linux[@]:$((pos + 1))}"); echo ${Linux[@]}; $./ArrayManip.sh Debian Red Hat Ubuntu Fedora
Bir Dizinin Kopyalanması $ Linux=("Debian" "Red Hat" "Ubuntu" "Suse" "Fedora"); $ LinuxYedek=("${Linux[@]}"); $ echo ${LinuxYedek[@]}; Debian Red Hat Ubuntu Suse Fedora Çift tırnak kullanılmasaydı ne olurdu? Çift tırnağın kullanılması ve kullanılmaması durumlarında orijinal ve kopya dizinin boyutlarını test ediniz.
Bir Dizinin Elemanlarına Döngü İle Ulaşım (1) $ cat LogFile.txt Welcome to thegeekstuff Linux Unix
Bir Dizinin Elemanlarına Döngü İle Ulaşım (2) $ cat LoadContent.sh #!/bin/bash fileContent=(`cat LogFile.txt`) ; for i in "${fileContent[@]}" #Çift tırnaklara dikkat do echo "$i"; done $ ./LoadContent.sh
Bir Dizinin Elemanlarına Döngü İle Ulaşım (3) $ cat LoadContent.sh #!/bin/bash fileContent=($(cat LogFile.txt )) ; for((i=0;i<${#fileContent[@]};i++)) do echo "${fileContent[$i]}"; done $ ./LoadContent.sh
Bir Karakter Dizisinin (String) Boyutunun/Uzunluğunun Tespiti $ isim="Deniz DAL"; $ echo ${#isim}; 9 $ echo $isim | wc -c 10 $ echo -n $isim | wc -c Neden? $ echo $isim | od -abc
Uygulama Kendisine parametre olarak aldığı bir klasörün içerisindeki en uzun isme sahip dosyayı: dosya uzantısı isme dahil iken dosya uzantısı isme dahil değilken bularak ekrana basan iki kabuk programı yazınız.