Yapılandırılmış Komut Kullanımı-3
- Huseyin Şahan
- 11 Nis
- 4 dakikada okunur
Bu blog yazımızda (( .. )) ifadesinin kullanımını ele alacağız ve buna bağlı olarak operatörleri tartışacak ve örneklendireceğiz. Ardından [[ ... ]] kullanımını görüp case ifadelerine geçiş yapacağız. Hazırsanız başlayalım.
Çift Parantez Kullanımı
Bash betiklerinde test ... veya [ .. ] komutu ile temel aritmetik işlemler yapabilirsiniz ancak (( ... )) ile daha gelişmiş matematiksel ifadeler kullanabilirsiniz. Bu sayede C diline benzer bir sözdizimi kullanabilirsiniz.
(( ifade ))
Bu ifade atama işlemleri yapabilir veya koşul olarak kullanılabilir (if içinde). Aşağıda bu parantez içinde kullanabileceğiniz operatörler gösterilmiştir. Her operatörü ele alacağı ve örnek betik dosyalarıyla vereceğiz.
Sembol | Açıklama |
val++ | Sonradan artırma (post-increment) |
val-- | Sonradan azaltma (post-decrement) |
++val | Önceden artırma (pre-increment) |
--val | Önceden azaltma (pre-decrement) |
! | Mantıksal değil (negation) |
~ | Bitwise tersleme (negation) |
** | Üs alma (exponentiation) |
<< | Bit düzeyinde sola kaydırma |
>> | Bit düzeyinde sağa kaydırma |
& | Bitwise AND |
` | ` |
&& | Mantıksal AND |
Arttırma ve Azaltma Operatörleri
val++ kullanarak işlem yapılır ve değer sonra 1 arttırılır. Örnek bir betik dosyayı şöyle olabilir.
#! /bin/bash
deger=5;
(( sonuc = deger++ ))
echo "Sonuç: $sonuc, deger: $deger"
Komut çıktısı Sonuç: 5, deger: 6 olacaktır. Burada sonuc değişkenine doğrudan deger yani 5 değeri atanacaktır. Bunun nedeni ise arttırma operatörünün atama operatöründen sonra çalışmasıdır.
++val ile bir örnek yapalım. Bu sefer arttırma operatörü atama operatöründen önce çalışacak.
#! /bin/bash
deger=5;
(( sonuc = ++deger ))
echo "Sonuç: $sonuc, deger: $deger"
bu komut sonucunda çıktı Sonuç: 6, deger: 6 olacaktır.
Benzer mantıkla val-- veya --val ile azaltma operatörünü kullanabilirsiniz.
Mantıksal Değil (!)
Genellikle if koşullarında kullanılır ve mantıksal boole değeri ters çevirmeye yarar.
val=0
if (( !val )); then
echo "val is zero"
fi
Bitwise NOT (Bit Düzeyinde Tersleme)
Bit düzeyinde işlem yapan sistem veya ağ betiklerinde veya sistem programlamada kullanılır. Ancak komut satırı betiğinde bunu kullanmak pek anlamlı olmayabilir. C veya C++ için kullanışlıdır.
val=5 # Binary: 0101
(( result = ~val ))
echo $result # -6 (işaretli sayı sistemi nedeniyle)
Peki burada neler oldu biraz daha açalım. ~ operatörü sayının bitlerini ters çevirecektir.
00000000 00000000 00000000 00000101
Bu 5 sayısının ikilik gösterimidir. ~ ile bu bitleri tersine çevirelim:
11111111 11111111 11111111 11111010
Bu ise -6 sayısının ikilik gösterimine denk gelecektir. Yani bu kodun çıktısı -6'dır. Peki bunun -6 olduğunu nereden anladık dersenizde.
Bu ikilik sayıyı ters çevirin tekrardan ardından +1 ekleyin ve en soldaki biti 1 olduğu için sayının başına negatif koyun. (en soldaki bit 1 ise negatif, 0 ise pozitif imzalı tamsayı türleri için geçerlidir.).
Üs Alma
Sayının üssünü almak için ** kullanın.
val=3
(( result = val ** 4 )) # 3^4 = 81
echo $result
Bitwise Shift Operatörleri
Bit kaydırma, bir sayının ikilik (binary) gösterimini sağa ya da sola kaydırmaktır.
İki temel operatör vardır:
Operatör | Açıklama | Matematiksel Anlamı |
<< | Sola kaydırma | x << n → x * (2^n) |
>> | Sağa kaydırma | x >> n → x / (2^n) (tam sayı bölme) |
Daha iyi anlamanız için örnek bir binary kodu ele alalım. Örneğin 3 sayısı:
0011 ikilik değerine sahip olacaktır. Eğer bu bit değerini sola kaydırırsak:
0110 ikilik değerini elde ederiz. Yani 6 değerini
Bu örnekten yola çıkarsak. 3 değerini 1 kez sola kaydırırsak 3 x 2^1 = 6 yapacaktır. Yani her sola kaydırdığımızda kaç kez sola kaydırdıysak onu 2 nin üssü olarak ele alın. Burada mantık gerçekten basittir.
#! /bin/bash
val=3
(( result = 3 << 1 )) # 3 x 2^1 = 6
echo $result
Bu örnek bahsettiğimiz örneğin komutlaştırılmış halidir. << ifadesinden sonra kaç kez kaydıracağınızı verin. Aynı mantık sağa kaydırma için geçerlidir. bu sefer çarpmak yerine bölmeniz gereklidir.
Bitwise And - Or
Bit düzeyinde karşılaştırma yapmak için kullanılır. Özellikle dosya izin kontrolü gibi konularda vazgeçilmezdir.Aşağıdaki kod üzerinden sizlere bu durumun nasıl gerçekleştiğini anlatalım.
a=6 # 0110
b=3 # 0011
(( result = a & b ))
echo $result # 2
Burada her bit birbiri ile karşılaştırılacaktır.
a = 0110
b = 0011
-----------
a & b = 0010 → 2
Her bit alt alta birbiri ile kıyaslanmıştır. Şimdi asıl gelelim bu nerede kullanılır ? Örneğin dosya izinlerinde rwx değerleri 0 veya 1 gibi değerlerle ifade edilir. Örneğin:
perm=6 # 110 (rw-) # Beklenen İzin
READ=4 # 100 # Mevcut İzin
(( perm & READ )) && echo "Okuma izni var"
Eğer değer 0 değilse okuma izni vardır.
Yine bitwise or işlemide tek bir bit değeri eşit olsa bile doğru döndürecektir. Bu bit seviyesinde birleştirme işleminde kullanılır.
a=6 # 0110
b=3 # 0011
(( result = a | b )) # 0111 = 7
Mantıksal And - Or
Belirli koşulu kontrol etmek için kullanılır.
a=5
b=10
if (( a > 0 && b < 20 )); then
echo "Both conditions are true"
fi
Veya
x=5
y=25
if (( x < 10 || y < 10 )); then
echo "At least one condition is true"
fi
Gibi kullanabilirsiniz.
Çift Köşeli Parantez Kullanımı
Temel karşılaştırmaları [..] ile yapabilirdiniz ancak [[..]] daha güçlü bir kullanım sunar.
Ancak bu yazımın sadece bash gibi gelişmiş betiklerde çalıştığını unutmayın.
[[ ... ]] → Bash’e özel, gelişmiş test komutu.
[[ $USER == r* ]] → $USER değeri "r" harfiyle başlıyorsa eşleşir.
Pattern matching sayesinde daha okunabilir ve güçlü koşullar yazılabilir.
== ile birlikte joker karakterler (*, ?, vs.) kullanılabilir.
Yalnızca Bash gibi gelişmiş shell’lerde çalışır.
Aşağıdaki örnek r ile başlayan kullanıcıları bulmak için desen kullanmıştır.
#!/bin/bash
# desen eşleme örneği
if [[ $USER == r* ]]
then
echo "Hello $USER"
else
echo "Sorry, I do not know you"
fi
gibi örnekler yazabilirsiniz.
CASE Kullanımı
Çok sayıda if-else kullanmak yerine case kullanabilirsiniz. Bu daha temiz kod yazmanızı sağlar. Temel yazımı aşağıdaki gibidir.
case $deger in
desen1 | desen2)
komutlar
;;
desen3)
komutlar
;;
*)
varsayilan_komutlar
;;
esac
Aşağıda temel kullanımı verilmiştir:
#!/bin/bash
echo "Bir işlem seçin:"
echo "1) Selam Ver"
echo "2) Tarih Göster"
echo "3) Çık"
read secim
case $secim in
1)
echo "Merhaba! Nasılsın?";;
2)
echo "Bugünün tarihi: $(date)";;
3)
echo "Güle güle!";;
*)
echo "Geçersiz seçim yaptınız!";;
esac
gibi temel kullanıma sahiptir.
Bu blog yazımızda çift parantez ve çift köşeli parantez kullanımını ele aldık. Ayrıca C programlamadada kullanılan gelişmiş operatörleri ele aldık. (Bit kaydırma, And, Or..). Ardından case kullanımını temel olarak inceledik.
Bir blog yazımızın sonuna geldik görüşmek üzere...
Comments