Yapılandırılmış Komut Kullanımı-1
- Huseyin Şahan
- 5 Nis
- 4 dakikada okunur
Bir komut dosyasına basit komutlar yazarak çalıştırabilirsiniz. Ancak bazen mantıksal işlemler yapmanız ve çıktıları değerlendirip buna göre işlemler yapmak isteyebilirsiniz. Bu işlemleri yapmak için yapılandırılmış komutları kullanmanız gerekir. if veya case gibi bu blog yazımızda if-then kullanımını, string ve sayıların karşılaştırılmasının nasıl yapılacağını ele alacağız. case kullanımını sonraki blog yazılarımızda ele alacağız.
if-then yapısı
if-then yapısı bir komutun başarılı olup olmadığını kontrol eder.Komut başarıyla çalışırsa yani çıkış durumu sıfırsa ardından gelen komutlar çalıştırılır. Aşağıda if then kullanımının temeli gösterilmiştir.
if command
then
commands
fi
Basit bir komut yazalım. Bunun için bir dosya oluşturun:
darkside@debian:~/scriptfiles$ touch ifexample
Dosyayı açın ve aşağıdaki komutları yazın:
if pwd
then
echo "Komut Başarı ile çalıştı..."
fi
Bu komutu çalıştırmak için çalıştırma izni vermeniz gerekir:
darkside@debian:~/scriptfiles$ chmod u+x ifexample
İzni verdikten sonra dosyayı çalıştırabilirsiniz.
Eğer çaışmayan bir komut girdiğimizde then kısmını atlayacaktır. Aşağıda bunun için örnek verilmiştir:
if agsgsgag
then
echo "Komut Başarı ile çalıştı..."
fi
echo "Komut Çalıştırılmadı.."
Birden fazla komut çalıştırabilirsiniz:
#! /bin/bash
testuser=darkside
if grep $testuser /etc/passwd
then
echo "Kullanıcı mevcuttur:"
echo "Kullanıcı ana dizini: /home/$testuser"
fi
if-then -else yapısı
Daha önce sadece if kullanarak eğer verilen ifade doğru ise komut çalışacak eğer yanlış ise komut atlanacaktı. Eğer if bloğu çalışmazsa ve başka bir durum kullanmak isterseniz else anahtar kelimesini kullanabilirsiniz.
#! /bin/bash
if command
then
commands
else
commands
fi
Önceki örneğimizi genişletelim ve else anahtar kelimesi ile kullanıcı bulunmadığında kullanıcı yok hatası versin:
#! /bin/bash
testuser=darkside
if grep $testuser /etc/passwd
then
echo "Kullanıcı mevcuttur:"
echo "Kullanıcı ana dizini: /home/$testuser"
else
echo "Kullanıcı sistemde mevcut değil.."
fi
Burada eğer kullanıcı sistemde mevcutsa if değilse else bloğu çalışacaktır. Ancak burada tam olarak eşleşme sağlamak isterseniz grep komutunda -w anahtar kelimesini kullanın.
İç içe if-else kullanımı
Önceki örneğimizde else bloğunda birdaha if else kullanabiliriz. Eğer kullanıcı mevct değilse ancak klasör mevcutsa bu kod güzel çalışır.
#! /bin/bash
testuser=darkside
if grep $testuser /etc/passwd
then
echo "Kullanıcı mevcuttur:"
echo "Kullanıcı ana dizini: /home/$testuser"
else
echo "Kullanıcı sistemde mevcut değil.."
if ls -d /home/$testuser 2> /dev/null
then
echo "Kullanıcı yok ancak ana dizini var.."
else
echo "Kullnıcının ana dizinide yok.."
fi
fi
Burada eğer ls komutu dizini bulamazsa bu durumda ekrana hata çıktısı vermemesi için 2> /dev/null ile hata çıktısını boşluğa gönderdik.
Ancak bu şekilde iç içe karmaşık kod yazmak yerine elif anahtar kelimesi ile if bloğundaki şart çalışmazsa başka bir şart belirtebiliriz. Örneğin yukardaki komutta eğer kullanıcı yokda elif bloğu ile kullanıcı dizini varmı şeklinde bir sorgu atabiliriz.
#! /bin/bash
testuser=darkside
if grep $testuser /etc/passwd
then
echo "Kullanıcı mevcuttur:"
echo "Kullanıcı ana dizini: /home/$testuser"
elif ls -d /home/$testuser 2> /dev/null
then
echo "Kullanıcı yok ancak ana dizin klasörü var.."
else
echo "Kullanıcı sistemde mevcut değil.."
fi
Bu sayede daha temiz ve anlaşılır bir kod oldu. İsterseniz birden fazla elif komutunu birlikte kullanabilirsiniz.
Betiklerde test komutunun kullanımı
test komutu bir koşulu değerlendirmenizi sağlar koşul doğru ise true yanlış ise false döner.
darkside@debian:~/scriptfiles$ test ifade
Aşağıdaki komut dosyasında test komutuna bir parametre verilmeden kullanılmıştır. Bu durumda ifadeyanlış olarak değerlendirilecektir.
#! /bin/bash
if test
then
echo "İfade doğru döndü"
else
echo "İfade yanlış döndü"
fi
Başka bir örnek verelim bir değişkenşn içeriğinin olup olmadığını test edebiliriz.
#! /bin/bash
benim_degerim="İçerik Dolu"
if test "$benim_degerim"
then
echo "$benim_degerim ifadesi doğru döndürdü"
else
echo "$benim_degerim ifadesi yanlış döndürdü"
fi
Burada test komutundan sonra ifadeyi " " içinde kullanın. Bunun nedeni değişkenin boşluk içermesidir. Burada test komutunun başka alternatifide vardır bu if ifadesinden sonra köşeli parantez kullanmaktır.
Ancak test komutunun kullanımı bu kadar değildir. Bu komut aşağıdaki durumlarda kullanılır.
Sayısal Karşılaştırmalar (Numeric Comparisons)
Değişkenlerin sayısal değerlerini karşılaştırmak için kullanılabilir.
Dize Karşılaştırmaları (String Comparisons)
İki dizenin eşit olup olmadığını ya da birinin diğerine göre büyüklüğünü kıyaslamak için kullanılır.
Dosya Karşılaştırmaları (File Comparisons)
Bir dosyanın var olup olmadığını, erişilebilirliğini ya da türünü kontrol etmek için kullanılır (örneğin, dosya var mı, dizin mi, okuma yazma izni var mı vb.).
Hazırsanız her birini tek tek ele alalım.
Sayısal Karşılaştırmalar
Aşağıda sayısal karşılaştırmalar için yaygın operatörler verilmiştir:
Karşılaştırma | Açıklama |
n1 -eq n2 | n1'in n2'ye eşit olup olmadığını kontrol eder |
n1 -ge n2 | n1'in n2'den büyük veya eşit olup olmadığını kontrol eder |
n1 -gt n2 | n1'in n2'den büyük olup olmadığını kontrol eder |
n1 -le n2 | n1'in n2'den küçük veya eşit olup olmadığını kontrol eder |
n1 -lt n2 | n1'in n2'den küçük olup olmadığını kontrol eder |
n1 -ne n2 | n1'in n2'ye eşit olmadığını kontrol eder |
Aşağıda bu durumu anlatmak için bir örnek verilmiştir. Siz bu paramtreleri kullanarak istediğiniz örnekleri yazabilirsiniz.
#!/bin/bash
# Sayısal test değerlendirmeleri
#
value1=10
value2=11
#
if [ $value1 -gt 5 ]
then
echo "Değer $value1 5'ten büyüktür"
fi
#
if [ $value1 -eq $value2 ]
then
echo "Değerler eşittir"
else
echo "Değerler farklıdır"
fi
Dize Karşılaştırmaları
Dize karşılaştırmaları yapmak için aşağıdaki operatörler kullanılır.
Karşılaştırma | Açıklama |
str1 = str2 | str1 ile str2'nin eşit olup olmadığını kontrol eder |
str1 != str2 | str1 ile str2'nin eşit olmadığını kontrol eder |
str1 < str2 | str1'in str2'den küçük olup olmadığını kontrol eder |
str1 > str2 | str1'in str2'den büyük olup olmadığını kontrol eder |
-n str1 | str1'in uzunluğunun sıfırdan büyük olup olmadığını kontrol eder |
-z str1 | str1'in uzunluğunun sıfır olup olmadığını kontrol eder |
İlk olarak dize eşitliği için bir örnek verelim:
#!/bin/bash
# Dize eşitliği testi
testuser=darkside
#
if [ $USER = $testuser ]
then
echo "Hoşgeldin $testuser"
fi
Burada iki ifadenin eşitliği kontrol edilmiştir. Eğer isterseniz eşt olmayan bir örnek yapabilirsiniz.
#!/bin/bash
# Dize eşitliği testi
testuser=rich
#
if [ $USER != $testuser ]
then
echo "Bu kullanıcı $testuser değil !"
fi
Bir başka kullanım olarak dize sıralaması yapabiliriz. Ancak burada dikkat etmemiz gereken unsur kabuk > ve < işaretlerini veri yönlendirme olarak kullanıldığını zannedebilir. Bunu engellemek için \ işaretini kullanın. Aşağıda basit bir örnek verilmiştir.
#!/bin/bash
# Doğru dize karşılaştırma
val1=baseball
val2=hockey
#
if [ $val1 \> $val2 ]
then
echo "$val1 değeri büyüktür $val2"
else
echo "$val1 değeri küçüktür $val2"
fi
gibi kullanabilirsiniz.
Dize sıralamada Büyük karakterler küçük karakterlerden önce gelir. bunun nedeni kabuğun ASCII sıralama kullanmasıdır.
Başka örnek dize uzunluğunu bulabilrsiniz.
Bash'te bir dizenin uzunluğunu kontrol etmek için -n ve -z operatörleri kullanılır:
-n: Dize boş değilse (uzunluğu sıfırdan büyükse) doğru döner.
-z: Dize boşsa (uzunluğu sıfırsa) doğru döner.
#!/bin/bash
# Dize uzunluğu testi
val1=testing
val2=''
#
if [ -n $val1 ]
then
echo "$val1 dizesi boş değil"
else
echo "$val1 dizsi boş"
fi
#
if [ -z $val2 ]
then
echo "$val2 dizesi boş"
else
echo "$val2 dizesi boş değil"
fi
gibi kullanabilirsiniz.
Bu blog yazımızda if-then-else-elif kullanımlarını detaylıca inceledik ayrıca sayı ve dizeleri nasıl karşılaştırabileceğimizi betik dosyaları yazarak gördük.
Bir sonraki blog yazımızda dosyaları nasıl karşılaştırabileceğimizi ele alacağız. Sonraki blog yazımızda görüşmek üzere...
Comments