Bash Kabuk Betikleme/Giriş Egzersizleri

Bash betiğinin neler için kullanıldığını görmek için bazı örneklere bakacağız. Eğer şu an bu komutları anlamıyorsanız üzülmeyin.

Merhaba Dünya değiştir

Basit bir "merhaba dünya" programıyla başlayalım:

echo 'Merhaba, dünya!'

Bu komutu doğrudan Bash komut istemciye girebiliriz veya bir dosyaya (örneğin hello_world.sh) kaydedip istemciye bash hello_world.sh veya ./hello_world.sh yazarak çalıştırabiliriz. İki durumda da Merhaba, dünya! yazdırılacaktır:

$ echo 'Hello, world!'
Merhaba, dünya!

Burada Bash komut istemcisini belirtmek için $ işaretini kullandık. $ işaretinin yanındaki satır girdiğimiz komutu, sonraki satır ise komutun sonucunu göstermektedir.

Dosya Kontrolü değiştir

Şimdi daha karmaşık bir betiğe bakalım:

if [[ -e readme.txt ]] ; then
  echo '"readme.txt" isimli dosya bulundu.'
else
  echo '"readme.txt" isimli dosya bulunamadı.'
fi

Bu betik, mevcut dizinde readme.txt isimli bir dosyanın var olup olmadığını kontrol eder ve if sorgusunu kontrolün sonucuna göre hangi komutların çalıştırılacağını belirlemek için kullanır. Bu betik de doğrudan komut istemciye girilebilirdi ancak bu durumda pek işe yaramazdı.

Yukarıdaki örneklerin hepsi tamamen "Bash içinde" yazıldı yani herhangi bir haricî program gerektirmedi. (echo, if … then … else … fi, ve [[ -e … ]] komutları Bash'in yerleşik komutlarıdır.) Ancak bir kabuk betikleme dili olmasının yanında Bash'in kullanım alanının büyük kısmı haricî programları çalıştırmaktır. Alttaki betik bu beceriyi göstermektedir:

if [[ -e config.txt ]] ; then
  echo '"config.txt" isimli dosya halihazırda var. Varsayılan ile karşılaştırılıyor . . .'
  diff -u config-varsayılan.txt config.txt > config-fark.txt
  echo 'Fark, "config-diff.txt" isimli dosyaya yazıldı.'
else
  echo '"config.txt" isimli dosya bulunamadı. Varsayılan kopyalanıyor . . .'
  cp config-varsayılan.txt config.txt
  echo '. . . tamamlandı.'
fi

Buradaki diff ve cp komutları Bash'de yerleşik olarak bulunmasalar da Bash içeren sistemlerde yüklü gelen yaygın araç programlarıdır. Yukarıdaki betik config-varsayılan.txt isimli varsayılan konfigürasyon dosyasını farzediyor ve config.txt isimli başka bir konfigürasyon dosyasının varlığını kontrol ediyor. Eğer config.txt varsa betik diff isimli haricî programı kullanarak bir "diff" ("difference" = fark) yani iki dosya arasındaki farkı hesaplıyor, böylece kullanıcı varsayılan olmayan konfigürasyon dosyasında nelerin farklı olduğunu görebiliyor. Eğer config.txt isimli dosya bulunamıyorsa betik cp ("copy" = kopyalamak) isimli haricî programı kullanarak varsayılan konfigürasyon dosyasını config.txt ismiyle kopyalıyor.

Gördüğünüz gibi haricî programlar da aynı yerleşik komutlar gibi benzer sözdizimi kullanılarak çalıştırılabiliyor, çünkü iki tip de birer "komut".

Yukarıdaki betik fazla "ayrıntılı". Tipik bir betik, kullanıcılar bu kadar bilgiye ihtiyaç duymayacağı için echo komutunu çok kullanmaz. Aşağıdaki örnekte Bash tarafından yoksayılan # işaretini kullanarak betiğe yorum ekleyeceğiz. Bu tarz yorumlar kullanıcıdan ziyade betiği inceleyen kişiler için bilgilendirici olacaktır.

if [[ -e config.txt ]] ; then
  # eğer config.txt varsa:
  diff -u config-varsayılan.txt config.txt > config-fark.txt # nelerin değiştiğini gör
else
  # eğer config.txt yoksa:
  cp config-varsayılan.txt config.txt # varsayılanı al
fi

Bu tarz bir yorumlama yalnızca bu örnek için yapıldı, çünkü normalde bu kadar basit bir betik hiçbir yoruma ihtiyaç duymaz.