Selam değerli THT üyeleri ve forum dışı okuyucularımız.
Linux Shell Script Yazma Eğitimimizin ikinci bölümüne hoş geldiniz. Bu bölümde sizlere kodlama hakkında bir kaç bilgi daha verdikten sonra tüm bu bilgileri uygulamalar ile pekiştireceğiz. Linux shell script yazma eğitiminin ilk konusuna aşağıdaki bağlantıdan ulaşabilirsiniz;
Linux Shell Script Yazma Eğitimi | Temel Bilgiler ve Başlangıç #1
Script Yazmaya Devam
Matematiksel İşlemler
İlk olarak shell scriptin matematiksel işlemlerinden bahsedeceğim. Yani toplama, çıkarma, çarpma, bölme işlemlerini göreceğiz. Hangi karakterin hangi işlemi yaptığını öğrenelim;
Linux Shell Script Yazma Eğitimimizin ikinci bölümüne hoş geldiniz. Bu bölümde sizlere kodlama hakkında bir kaç bilgi daha verdikten sonra tüm bu bilgileri uygulamalar ile pekiştireceğiz. Linux shell script yazma eğitiminin ilk konusuna aşağıdaki bağlantıdan ulaşabilirsiniz;
Linux Shell Script Yazma Eğitimi | Temel Bilgiler ve Başlangıç #1
Script Yazmaya Devam
Matematiksel İşlemler
İlk olarak shell scriptin matematiksel işlemlerinden bahsedeceğim. Yani toplama, çıkarma, çarpma, bölme işlemlerini göreceğiz. Hangi karakterin hangi işlemi yaptığını öğrenelim;
- + = Toplama
- - = Çıkarma
- * = Çarpma
- / = Bölme
Shell scriptte bu işlemleri yaptırmanın birden fazla yolu vardır. Aşağıdaki örnekte gördüğünüz gibi iki çeşit toplama işlemi kodlanmıştır ve ikisi de çalışarak doğru sonuç vermiştir;
Bir " `expr $x + $y " şeklinde yazımı var. Birde daha basit olan " ((sonuc=$x+$y)) " şeklinde olan yazımı var. Ben burada karışıklık olmasın diye sadece toplama işleminden örnek verdim. Siz aynı yazımları -, /, * şeklinde yaparsanız ona göre işlem yapacaktır. Bu işlemlerden harici olarak üs ve mod alma işlemleri de vardır. Bu işlemlerin yazımı da aşağıdaki gibidir. Tanımlama ve yazdırma işlemleri aynıdır;
% = Mod Alma
** = Üs Alma
İlişkisel (Relational) Operatörler
Şimdi ise relational operatörlerini yani işlem operatörlerini göreceğiz. Bu operatörler şöyledir;
Bir " `expr $x + $y " şeklinde yazımı var. Birde daha basit olan " ((sonuc=$x+$y)) " şeklinde olan yazımı var. Ben burada karışıklık olmasın diye sadece toplama işleminden örnek verdim. Siz aynı yazımları -, /, * şeklinde yaparsanız ona göre işlem yapacaktır. Bu işlemlerden harici olarak üs ve mod alma işlemleri de vardır. Bu işlemlerin yazımı da aşağıdaki gibidir. Tanımlama ve yazdırma işlemleri aynıdır;
% = Mod Alma
** = Üs Alma
İlişkisel (Relational) Operatörler
Şimdi ise relational operatörlerini yani işlem operatörlerini göreceğiz. Bu operatörler şöyledir;
- -eq (equal) = Eşittir (==)
- -ne (not equal) = Eşit Değildir (!=)
- -gt (greater than) = Büyüktür
- -ls (less than) = Küçüktür
- -ge (greater or equal) = Büyük yada Eşit
- -le (less or equal) = Küçük yada Eşit
İlişkisel operatörler ile ilgili örnekleri aşağıda görebilirsiniz;
Dosya Durumları ile İlgili İşlemler
Dosya var mı yok mu gibi komutları, kontrolleri shell script ile yapabiliriz. Bunun için de parametreler kullanmamız gerek;
Dosya Durumları ile İlgili İşlemler
Dosya var mı yok mu gibi komutları, kontrolleri shell script ile yapabiliriz. Bunun için de parametreler kullanmamız gerek;
- -r (read) = Dosya Okunabilir
- -w (write) = Dosya Yazılabilir
- -x (execute) = Dosya Çalıştırılabilir
- -f (file)
- -d (directory)
- -s (size)
- x (exists)
Dosya kontrolleri ile ilgi örneği aşağıda görebilirsiniz;
Select Komutu Kullanımı
Bash scriptte yeni bir komut öğreneceğiz. Select komutunu döngü gibi düşünebilirsiniz fakat bu komut bize daha opsiyonel seçenekler sunuyor. Verdiğimiz kelimelere göre menü oluşturuyor. Belirlediğimiz değişken adına farklı değerler ekliyoruz ve istediğimiz değeri içinden alabiliyoruz. Örnek aşağıdaki gibidir;
Sleep Komutu Kullanımı
Bazen öyle anlar geliyor ki shell scriptimiz çalışırken bir komut bittikten sonra belli bir süre beklememiz gerekebiliyor. Bu işlemi performans veya çeşitli spesifik nedenler için kullanılabiliyor. İşte bu tarz durumlar için komutların çalışması arasında bekleme tanımlaması yapmamız gerekiyor. Çok basit bir kullanımı vardır. Aşağıdaki örnekten anlayabilirsiniz;
Şimdi ise while döngüsü ile basit bir geri sayım uygulaması yapalım;
Uygulamalar
Kullanıcı Kontrol Uygulaması
Basit bir kontrol uygulaması, eğer kullanıcı adı veya şifre uymazsa "Kullanıcı adınız veya şifreniz yanlış!" şeklinde uyarı verecektir. Kullanıcı adı ve şifre doğruysa "Giriş başarılı. Hoş geldiniz KULLANICIADI" şeklinde ekrana yazdıracaktır.
Yapımı
Echo ile kullanıcıya "Kullanıcı Adınız:" sorusunu soruyorum ve girilen değeri kullanici adında bir değişkene atıyorum. Aynısını şifre için de soruyorum ve sifre değişkenine atıyorum. Şimdi ise bize güzel bir if koşulu lazım." if [[ ( $kullanici == "SafakBey" && $sifre == "GreenTeam" ) ]]; then " şeklinde bir koşul koyuyorum ve kodları altında yazıyorum. Bu demek oluyor ki eğer kullanici değişkeni SafakBey 'e eşitse ve sifre değişkeni GreenTeam 'e eşitse ekrana "Giriş başarılı. Hoş geldiniz $kullanici" yaz diyorum. Eğer bu değişkenlerin ikisinden biri bile tutmazsa "Kullanıcı adınız veya şifreniz yanlış!" yazdırıyorum.
Menü Sistemli Uygulama
Menü sistemli uygulamamızda üç tane başlık olacak Ram Bilgisi, Network Bilgisi, Çıkış bu üç başlık bir döngü içinde olacak ve her başlığı seçtiğimizde devam etmemiz için program bizi durduracak.
Yapımı
İlk olarak fonksiyonlarımızı yazarak başlayalım. She-bang' i yazdıktan sonra menu fonksiyonumuzu yazalım. Bu fonksiyona echo ile başlıklarımızı yazdırıyoruz. Menülerimizi oluşturduğumuza göre şimdi ise başlıklarımızın fonksiyonlarını oluşturalım. Ram adında bir fonksiyon oluşturuyorum. Ram bilgisini almak için "free -m" ve "vmstat" komutları lazım. Şimdi ise network fonksiyonumuza geldik. Network bilgisini almak için de "ip -4 address show" kodu lazımdır. Üçüncü başlığımızı yazacağı fakat şöyle bir sıkıntımız var. Scripti çalıştırdığımızda bize istediğimiz başlığın bilgisini veriyor ve kapatıyor ben burada scripte öyle bir şey yapmalıyım ki her başlık seçtiğimde script tekrar tekrar dönmeli. Bunun için de "durdur" adında bir fonksiyon oluşturuyorum. Biraz karmaşık bir fonksiyon anlatmayacağım. Her şey güzel fakat menüyü çalıştırdıktan sonra bir seçim yapmamız gerek bu işlem için de secim fonksiyonu oluşturuyorum. " read -p "Seçiminizi yapınız [1-3]" c " diyerek bir mesaj yazdırıyorum ve c değişkenine atıyorum. case ile c in 1) ram;; 2)network;; 3) echo "Hoşçakal"; exit 0;; *) "Lütfen 1-3 arasında bir seçim yapınız" ve en sona da durdur fonksiyonumu çağırıyorum. Her şey tamam tüm fonksiyonlarımızı yazdık. Artık while döngüsü açarak temel fonksiyonlarımızı çağırıyorum.
Veritabanı Yedekleme
Veritabanı yedekleme uygulaması, yazılan script her gün veritabanını yedekleyerek "veritabanıadı-tarih.sql.gz" şeklinde yedekleme yapacaktır.
Yapımı
İlk olarak değişkenlerimizi oluşturuyoruz. Tarih için BUGUN adında bir değişken tanımlıyoruz ve değerini " `date +"%d-%m-%Y"` " şeklinde veriyoruz. Daha sonra veritabanımızın host adresi lazım MYSQL_HOST yazarak değerine host adresiminiz bilgisini veriyoruz. MYSQL_PORT yazarak da port bilgisini giriyoruz. Şimdi ise kullanıcı bilgileri lazım, MYSQL_KULLANICI ve MYSQL_SİFRE değişkenleri oluşturuyoruz ve bilgileri atıyoruz. Bilgileri girdiysek hangi veritabanını yedekleyeceğimizi öğrenmemiz lazım bunun için de VERITABANI adında bir değişken oluşturuyoruz ve yedeklenecek veritabanının adını yazıyoruz. Değişkenlerimiz tamamdır artık basit bir mysqldump komutu ile veritabanımızı yedekleyebiliriz. "mysqldump -h $MYSQL_HOST -P $MYSQL_PORT -u $MYSQL_KULLANICI -p$MYSQL_SIFRE $VERITABANI | gzip > $VERITABANI-$BUGUN.sql.gz" diyerek yedekleme işlemini yapmış oluruz. En sonda ise basit bir if kontrolü ile "tamamlandı" veya "hata oldu" şeklinde kullanıcıya işlem hakkında bilgi veriyoruz.
Serimiz bu kadardı dostlar. Kısa bir seri olacağını söylemiştim Diğer konularda görüşmek üzere. Esen kalın...
Select Komutu Kullanımı
Bash scriptte yeni bir komut öğreneceğiz. Select komutunu döngü gibi düşünebilirsiniz fakat bu komut bize daha opsiyonel seçenekler sunuyor. Verdiğimiz kelimelere göre menü oluşturuyor. Belirlediğimiz değişken adına farklı değerler ekliyoruz ve istediğimiz değeri içinden alabiliyoruz. Örnek aşağıdaki gibidir;
Sleep Komutu Kullanımı
Bazen öyle anlar geliyor ki shell scriptimiz çalışırken bir komut bittikten sonra belli bir süre beklememiz gerekebiliyor. Bu işlemi performans veya çeşitli spesifik nedenler için kullanılabiliyor. İşte bu tarz durumlar için komutların çalışması arasında bekleme tanımlaması yapmamız gerekiyor. Çok basit bir kullanımı vardır. Aşağıdaki örnekten anlayabilirsiniz;
Şimdi ise while döngüsü ile basit bir geri sayım uygulaması yapalım;
Uygulamalar
Kullanıcı Kontrol Uygulaması
Basit bir kontrol uygulaması, eğer kullanıcı adı veya şifre uymazsa "Kullanıcı adınız veya şifreniz yanlış!" şeklinde uyarı verecektir. Kullanıcı adı ve şifre doğruysa "Giriş başarılı. Hoş geldiniz KULLANICIADI" şeklinde ekrana yazdıracaktır.
Yapımı
Echo ile kullanıcıya "Kullanıcı Adınız:" sorusunu soruyorum ve girilen değeri kullanici adında bir değişkene atıyorum. Aynısını şifre için de soruyorum ve sifre değişkenine atıyorum. Şimdi ise bize güzel bir if koşulu lazım." if [[ ( $kullanici == "SafakBey" && $sifre == "GreenTeam" ) ]]; then " şeklinde bir koşul koyuyorum ve kodları altında yazıyorum. Bu demek oluyor ki eğer kullanici değişkeni SafakBey 'e eşitse ve sifre değişkeni GreenTeam 'e eşitse ekrana "Giriş başarılı. Hoş geldiniz $kullanici" yaz diyorum. Eğer bu değişkenlerin ikisinden biri bile tutmazsa "Kullanıcı adınız veya şifreniz yanlış!" yazdırıyorum.
Bash:
#!/bin/bash
echo "Kullanıcı Adınız: " # "Kullanıcı adınız" şeklinde soru soruyoruz ve kullanici değişkenine atıyoruz.
read kullanici
echo "Şifreniz: " # Aynı şekilde "Şifreniz" şeklinde soru soruyoruz ve sifre değişkenine atıyoruz.
read sifre
if [[ ( $kullanici == "SafakBey" && $sifre == "GreenTeam" ) ]]; then
echo "Giriş başarılı. Hoş geldiniz SafakBey" # "Giriş başarılı yaz.
else
echo "Kullanıcı adınız veya şifreniz yanlış!" # Eğer koşul karşılanmıyorsa "Hatalı" şeklinde yaz.
fi
Menü Sistemli Uygulama
Menü sistemli uygulamamızda üç tane başlık olacak Ram Bilgisi, Network Bilgisi, Çıkış bu üç başlık bir döngü içinde olacak ve her başlığı seçtiğimizde devam etmemiz için program bizi durduracak.
Yapımı
İlk olarak fonksiyonlarımızı yazarak başlayalım. She-bang' i yazdıktan sonra menu fonksiyonumuzu yazalım. Bu fonksiyona echo ile başlıklarımızı yazdırıyoruz. Menülerimizi oluşturduğumuza göre şimdi ise başlıklarımızın fonksiyonlarını oluşturalım. Ram adında bir fonksiyon oluşturuyorum. Ram bilgisini almak için "free -m" ve "vmstat" komutları lazım. Şimdi ise network fonksiyonumuza geldik. Network bilgisini almak için de "ip -4 address show" kodu lazımdır. Üçüncü başlığımızı yazacağı fakat şöyle bir sıkıntımız var. Scripti çalıştırdığımızda bize istediğimiz başlığın bilgisini veriyor ve kapatıyor ben burada scripte öyle bir şey yapmalıyım ki her başlık seçtiğimde script tekrar tekrar dönmeli. Bunun için de "durdur" adında bir fonksiyon oluşturuyorum. Biraz karmaşık bir fonksiyon anlatmayacağım. Her şey güzel fakat menüyü çalıştırdıktan sonra bir seçim yapmamız gerek bu işlem için de secim fonksiyonu oluşturuyorum. " read -p "Seçiminizi yapınız [1-3]" c " diyerek bir mesaj yazdırıyorum ve c değişkenine atıyorum. case ile c in 1) ram;; 2)network;; 3) echo "Hoşçakal"; exit 0;; *) "Lütfen 1-3 arasında bir seçim yapınız" ve en sona da durdur fonksiyonumu çağırıyorum. Her şey tamam tüm fonksiyonlarımızı yazdık. Artık while döngüsü açarak temel fonksiyonlarımızı çağırıyorum.
Bash:
#!/bin/bash
function menu() { # Scriptimizin menü fonksiyonunu oluşturuyoruz.
echo "************"
echo "* ANA MENÜ *"
echo "************"
echo "1) RAM Bilgisi"
echo "2) Network Bilgisi"
echo "3) ÇIKIŞ"
}
function ram() { # Ram fonksiyonumuzu oluşturuyoruz ve ram bilgisi için gerekli komutları yazıyoruz.
free -m
vmstat
durdur
}
function network() { # ve aynı şekilde network fonksiyonumuzu oluşturuyoruz.
ip -4 address show
durdur
}
function durdur() { # Bu fonksiyon bir başlık seçtikten sonra programı beklemeye alacak.
local mesaj="$@"
[ -z "$mesaj" ] && mesaj="Devam etmek için ENTER tuşuna basınız"
read -p "$mesaj" readEnterKey
}
function secim() { # Şimdi ise kullanıcının hangi başlığı seçtiğini öğrendiğimiz fonksiyonu yazıyoruz.
read -p "Seçiminizi yapınız [1-3] " c
case $c in
1) ram;;
2) network;;
3) echo "Hoşçakal"; exit 0;;
*) echo "Lütfen 1-3 arasında bir seçim yapınız"
durdur
esac
}
while true # Tüm fonksiyonlar tamamdır. While döngüsü ile ana fonksiyonlarımızı çağırıyoruz.
do
menu
secim
done
Veritabanı Yedekleme
Veritabanı yedekleme uygulaması, yazılan script her gün veritabanını yedekleyerek "veritabanıadı-tarih.sql.gz" şeklinde yedekleme yapacaktır.
Yapımı
İlk olarak değişkenlerimizi oluşturuyoruz. Tarih için BUGUN adında bir değişken tanımlıyoruz ve değerini " `date +"%d-%m-%Y"` " şeklinde veriyoruz. Daha sonra veritabanımızın host adresi lazım MYSQL_HOST yazarak değerine host adresiminiz bilgisini veriyoruz. MYSQL_PORT yazarak da port bilgisini giriyoruz. Şimdi ise kullanıcı bilgileri lazım, MYSQL_KULLANICI ve MYSQL_SİFRE değişkenleri oluşturuyoruz ve bilgileri atıyoruz. Bilgileri girdiysek hangi veritabanını yedekleyeceğimizi öğrenmemiz lazım bunun için de VERITABANI adında bir değişken oluşturuyoruz ve yedeklenecek veritabanının adını yazıyoruz. Değişkenlerimiz tamamdır artık basit bir mysqldump komutu ile veritabanımızı yedekleyebiliriz. "mysqldump -h $MYSQL_HOST -P $MYSQL_PORT -u $MYSQL_KULLANICI -p$MYSQL_SIFRE $VERITABANI | gzip > $VERITABANI-$BUGUN.sql.gz" diyerek yedekleme işlemini yapmış oluruz. En sonda ise basit bir if kontrolü ile "tamamlandı" veya "hata oldu" şeklinde kullanıcıya işlem hakkında bilgi veriyoruz.
Bash:
#!/bin/bash
##### YEDEĞİNİ ALACAĞIMIZ DATABASE İÇİN GEREKLİ BİLGİLERİ YAZIYORUZ.
BUGUN=`date +"%d-%m-%Y"`
MYSQL_HOST='localhost'
MYSQL_PORT='3306'
MYSQL_KULLANICI='MYSQLKULLANICIADI'
MYSQL_SIFRE='MYSQLŞİFRESİ'
VERITABANI='VERİTABANIADI'
###################################################################
# Basit bir mysqldump komutu ile yedeği alıyoruz.
mysqldump -h $MYSQL_HOST -P $MYSQL_PORT -u $MYSQL_KULLANICI -p$MYSQL_SIFRE $VERITABANI | gzip > $VERITABANI-$BUGUN.sql.gz
if [ $? -eq 0 ] # Kullanıcıya bilgilendirme yapıyoruz.
then
echo "Tamamlandı"
else
echo "Hata oldu"
fi
Serimiz bu kadardı dostlar. Kısa bir seri olacağını söylemiştim Diğer konularda görüşmek üzere. Esen kalın...