top of page

Yapılandırılmış Komut Kullanımı-3

  • Yazarın fotoğrafı: Huseyin Şahan
    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


bottom of page