Linux Shell Script Yazma Eğitimi | Kodlamaya Devam ve Uygulamalar #2

Safak-Bey

Uzman üye
9 Ara 2021
1,794
1,982
Gereken Yerde
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

inxnx2q.png


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;

171bf3c543428d439.png
28614e786eeaab60f.png


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;

1169ce2986898ffdde.png
1eccf72f259c59486.png

22bd109362f060344a.png
240ca35a71df0ca46.png


🟢
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;

4.jpg
15d88e242e84256e8.jpg

Ekran-goruntusu_2022-07-27_10-33-19.jpg


🟢
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;

selectkodlari97fcd3fa69b3a974.png
select44e1141d0c1cab72.png


🟢
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;

sleepkodlarif75f243e934484c6.png
sleep9d368c8c813afeda.png


Şimdi ise while döngüsü ile basit bir geri sayım uygulaması yapalım;

sleepornekkodlaribead2828965061ed.png
sleepornekfb287d0f5b09d356.png




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
uygulama1d1a224c56ac40ba4.png


🟢
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
uygulama21.png


🟢
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...
 

Blwe

Uzman üye
17 Şub 2021
1,585
1,645
Green/Moderasyon
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

inxnx2q.png


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;

171bf3c543428d439.png
28614e786eeaab60f.png


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;

1169ce2986898ffdde.png
1eccf72f259c59486.png

22bd109362f060344a.png
240ca35a71df0ca46.png


🟢
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;

4.jpg
15d88e242e84256e8.jpg

Ekran-goruntusu_2022-07-27_10-33-19.jpg


🟢
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;

selectkodlari97fcd3fa69b3a974.png
select44e1141d0c1cab72.png


🟢
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;

sleepkodlarif75f243e934484c6.png
sleep9d368c8c813afeda.png


Şimdi ise while döngüsü ile basit bir geri sayım uygulaması yapalım;

sleepornekkodlaribead2828965061ed.png
sleepornekfb287d0f5b09d356.png




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
uygulama1d1a224c56ac40ba4.png


🟢
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
uygulama21.png


🟢
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...
Ellerinize sağlık Şafak hocam :)
 

JohnWick51

Uzman üye
20 Mar 2022
1,866
770
28
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

inxnx2q.png


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;

171bf3c543428d439.png
28614e786eeaab60f.png


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;

1169ce2986898ffdde.png
1eccf72f259c59486.png

22bd109362f060344a.png
240ca35a71df0ca46.png


🟢
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;

4.jpg
15d88e242e84256e8.jpg

Ekran-goruntusu_2022-07-27_10-33-19.jpg


🟢
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;

selectkodlari97fcd3fa69b3a974.png
select44e1141d0c1cab72.png


🟢
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;

sleepkodlarif75f243e934484c6.png
sleep9d368c8c813afeda.png


Şimdi ise while döngüsü ile basit bir geri sayım uygulaması yapalım;

sleepornekkodlaribead2828965061ed.png
sleepornekfb287d0f5b09d356.png




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
uygulama1d1a224c56ac40ba4.png


🟢
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
uygulama21.png


🟢
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...
Ellerine saglik
 

Safak-Bey

Uzman üye
9 Ara 2021
1,794
1,982
Gereken Yerde
Gözümü yormayan konu görünümlerine hayranım. Ellerine sağlık canım.
Sağolun hocam :)
Eline Emeğine Sağlık Güzel Konu Şafağım.
Eyvallah deltam eksik olma :) <33
Eline sağlık mükemmel :)
Teşekkürler :)
Eline emeğine sağlık kardeşim.
Forumda benzeri olmayan işler bunlar <3
Eyvallah, teşekkür ederim <33
Ellerine sağlık. Çok iyi gidiyor seri.
Teşekkür ederim, sağolun <33
Ellerinize sağlık Şafak hocam :)
Teşekkür ederim canım sağolasın
Ellerinize sağlık hocam.
Teşekkür ederim
Teşekkürler
Emek :) Ellerinize sağlık.
Teşekkür ederim Nemesis bey sağolun :) <33
Elinize emeğinize sağlık SafakBey :ninja:
Eyvallah sağolasın :)
Artı artı artı
<333
 

Safak-Bey

Uzman üye
9 Ara 2021
1,794
1,982
Gereken Yerde
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.