Linux Bash Script Öğreniyorum – I

Merhaba,

Bir süre aradan sonra çevremdeki linux eksikliğini farkettim ve ve en azından bash script yazmanın insanları linuxdan korkutan birşey olmadığını göstermek üzere bir yazı yazmayı düşündüm. Ben bu tüm herşeyi bu yazıda yazmamak adına bir kaç bölümden oluşturacağım ve en sonunda bir de bonus yazısı olarak sıkça kullanılacak şeyleri yazmayı düşünüyorum.

Başlangıç


#!/bin/bash

Yukarıdaki satır sonraki alt satırların hangi kabuk tarafından yorumlanacağını bildiren standart bir tanımdır ve hemen her bash
scriptinde olmalıdır. Ben alışkanlık olarak bir scripti incelerken hemen en başa gider ve bu alana bakarım örneğin. Bazen burada bin/bash yerine bin/sh gibi değişik şeyler de görebilirsiniz. Ufak tefek bizi pek de enterese etmeyen farkları vardır elbet. # işareti normalde yorum satırı da ola burada özel bir görevi de vardır.
Eğer bash programı /bin/bash değilde farklı bir yerde ise scriptlerin başına o değer yazılmalıdır.
Linux altında bir programın hangi dizin altında olduğunu which komutu ile bulabiliriz.

$ which bash

Bu arada komut satırında yazacağımız alanlarda $ işaretinin olması normal kullanıcı ile # işaretinin olması ise root kullanıcısıyla yaptığımızı gösterir, bunu da ifade ettikten sonra devam edebiliriz.

çıktı olarak /bin/bash gibi bir ifade verecektir.

Scriptimizi kaydettikten sonra çalıştırma hakkı verelim. Bunun için chmod komutu kullanılır.
Scriptimizi hello.sh adı ile kaydettiğimizi varsayarsak aşağıdaki komut ile scriptimize çalıştırma hakkı vermiş oluruz. (chmod için değişik ve daha şık varvasyonlar vardır ama bu konumuz dışı olduğu için ilgileniyorsanız nette bir araştırın derim)

 $ chmod +x hello.sh
 $./hello.sh
 Merhaba Dunya!

Bu arada linuxda uzantılar çok da önemli değildir, istediğiniz uzantıyı verebilirsiniz fakat sonradan ne olduğunu anlamak adına sh uzantısı verebilirisiniz.

Çevresel Değişkenler

Her işletim sistemi çeşitli amaçlarla kullanılmak üzere çevresel değişkenlere sahiptir. Linux gibi sistem yönetiminin çoğunlukla komut satırından yapıldığı sistemlerde bu değişkenlerin önemi bir kat daha fazladır. Linux altında sık kullanılan çevresel değişkenler ve manaları: $HOME : O anki kullanıcının ev dizinini gösterir

$USER& : O anki kullanıcının kim olduğunu gösterir

$PS1: Kullanıcının komut satırındaki işaret( tolga@ linux $ gibi)

$SHELL: Kullanıcının komut yürttüğü kabuk ismi Çevresel değişkenleri aynı normal değişkenler gibi kullanabiliriz.

echo $HOME
/home/tolga
echo $SHELL
/bin/bash

Çevresel Değişken tanımlama

Çevresel değişkenler işletim sistemi kurulumu ile birlikte hazır geleceği gibi kendimizde tanımlayabiliriz ve devamlı
kullanım için kaydedebiliriz.
Mesela YASAK_BOLGE diye bir çevresel değişken tanımlayıp bunu tüm programlar için geçerli kılmak istersek aşağıdaki komut
işimizi görecektir.

 $export YASAK_BOLGE="/home/tolga/private/security"

Bu yaptığımız tanımlamalar sistemin bir sonraki açılışında kaybolacaktır, kalıcı hale getirmek için:
/etc/bashrc ya da kendi ev dizinimizdeki .bashrc dosyasına yazmalıyız.(Başında . işaretinin bulunması linuxda gizli dosya olduğunu gösterir.)

Değişkenler

Tanımladığımız değişkenin tipinin belirtilmesine gerek yoktur, değişkenin kullanıldığı yere göre tipi belirlenir.
UYARI: Değişken kullanırken çift tırnak (” “) ya da tek tırnak(‘ ‘) kullanmanın farkı; “” arasında kullanacağımız bazı özel
karekterler BASH tarafından farklı komutmuş gibi işlem görecektir.
Mesela bash için ! karekterinin özel bir anlamı vardır ve biz bu karekteri “” arasında kullanırsak ekrana ! karekteri basılmaz da ! karekterinin bash için ifade ettiği değer basılır. Bu tip hatalardan kaçınmak için yeri geldiğinde tek tırnak (‘ ‘) kullanılır. Çift tırnağın aksine tek tırnak arasındaaldığı tüm karekterleri olduğu gibi yansıtır.

 $isim= 'Tolga YILMAZ'
 echo $isim
 Tolga YILMAZ

Komut çıktısını değişkene atama

Linux altında herhangi bir komutun çıktısı sonradan kullanmak amacıyla değişkene atılabilir.


MYFILES=$(ls /etc | grep ab)

Çalıştırılan komutu () arasına alarak ve başına $ işareti koyarak değişkene atama yapar ve istediğimiz yerde kullanabiliriz.
İlk satırdaki “|” karekteri pipe olarak geçer ve bir komutun çıktısını bir sonraki komuta girdi olarak aktarmaya yarar,
yani ls /etc/nin çıktısı grep komutuna parametre olarak aktarılmış.
/etc dizini listelenerek içerisinde ab kelimesi(birleşik ab karekterleri) geçen tüm dosyalar MYFILES değişkenine atanıyor.

echo $MYFILES
 crontab entropychatdisable fstab inittab mtab quotatab updfstab

Özel Değişkenler

Bash ile programlama yaparken kullanabileceğimiz bazı özel değişkenler vardır. Bunları kullanmak için tanımlamamız gerekmez.
Mesela bu değişkenlerden $0 çalışan programın adını verirken $1 ilk parametreyi , $2 2. parametreyi ve $# değişkeni de toplam parametre sayısını gösterir.

echo "program ismi= $0"
 echo "ilk parametre= $1"
 echo "ikinci parametre=$2"
 echo "Toplam parametre sayisi=$# "
 $ ./test.sh parametre_1 parametre_2

program ismi=test.sh
ilk parametre= parametre_1
ikinci parametre= parametre_2
Toplam parametre sayisi=3

IF Koşulu

Öncelikle ileride kullanımına geçmeden önce kısaca bir if deyiminden dem vuralım if ifadesi içinde şunları kullanabilrsiniz

-eq Eşittir || -lt küçüktür || -gt büyüktür || -ge büyük veya eşittir || -le küçük veya eşittir.

Şablon ise şu şekildedir.


if [ koşul ]
then
#komutlar
elif [ koşul2 ]
then
# komutlar_2
# ..
elif [ koşul3 ]
then
#..
else
#     komutlar_x
# fi

UYARI: Aşağıda ilk örnekde aritmetik bir karşılaştırma yapılırken ikinci örnekte string karşılaştırması yapılıyor.
String karşılaştırma işlemlerinde değişken ve karşılaştırma yapılan taraf mutlaka “” (çift tırnak) arasında verilmelidir, aksi takdirde hata alabilirsiniz.


$sayi=3
$sbt =3
if [ "$sayi" -eq 3 ]
then
echo "sayi 3’e esittir 3"
fi
if [ "$sbt" = "3" ]
then
echo "sbt degeri 3’dur"
fi
if [ $var = "Yes" ]
then
echo "Deger = Yes"
elif [ $var = "No" ]
then
echo "Deger= No"
else
echo "Gecersiz Deger.."
fi

String Karşılaştırmaları

Bir string ifadesinin if koşulu içindeki anlamı aşağıdaki gibi görülür

if [ string ] string null değil
if [ -n string ] string uzununluğu 0’dan büyük
if [ -z string ] string uzunluğu tam olarak 0
if [ string1 = string2 ] string1 ve string2 eşit. tek veya çift = kullanılabilir
if [ string1 == string2 ] Bu kullanım kesinlikle tavsiye edilir.
if [ string1 != string2 ] string1 ve string2 eşit değil
if [ string1 > string2 ] string1 string2 den sonra gelir.
if [ string1 < string2 ] string1 string2 den önce gelir.

ANSWER = maybe
if [ -z "$ANSWER" ]; then
echo "There is no answer." >&2
exit 1
fi
if [ "$ANSWER" = "yes" ]; then
echo "The answer is YES."
elif [ "$ANSWER" = "no" ]; then
echo "The answer is NO."
elif [ "$ANSWER" = "maybe" ]; then
echo "The answer is MAYBE."
else
echo "The answer is UNKNOWN."
fi

Not: Yukarıda dikkat etmişinizdir then ifadesi kullanırken if ile aynı satırda değilse ; gerek yoktur eğer aynı satırda kullanacaksanız if deyiminden sonra bir ; bırakmalısınız. Yani if için iki kullanım şu şekilde olabilir

if [ ... ] ; then

...

if[ ]

then

if ifadelerinde [] işaretçilerinden önce ve sonra boşluk bırakmanız kesinlikle tavsiye edilir.

Kullanıcı ile iletişim

read komutunu kullanarak kullanıcıdan bilgi alır ve bu bilgiyi bir değişkene atayarak kullanabiliriz.

echo –n "Adinizi Giriniz: "

-n seçeneği çıktı verildikten sonra bir alt satıra geçilmesini sağlar
read name

echo "Merhaba $name !"

read komutuna –t parametresi vererek kullanıcının belirli bir süre içinde giriş yapmasını sağlayabiliriz. Eğer belirlene sürede kullanıcı herhangi bir şey girmezse bir sonraki adım işleme sokulur yani kullanıcı hakkını kaybetmiş olur. Benzer şekilde kullanıcının girdiği verileri ekrana yazmak istemezsek -mesela parola gibi- read komutunu –s parametresi ile denemeliyiz.

echo -n "3 saniye icinde giris yapmalisiniz! &gt; "
if read -t 3 response; then
    echo "Basarilar, 3 saniyeyi gecirmediniz"
else
    echo "Biraz daha hizli yazmalisiniz!"
fi
echo -n "Kullanici Adiniz:"
read -t 4 user
echo -n "Parolaniz :"
read -s parola
echo "$user kullanicisi ve $parola sifresi ile sisteme giris yaptiniz!"

Diğer read komutu parametreleri
-a array girişin 0 indexli bir dizide tutulmasını sağlar.
-d delimiter girdin enter’a basmak yerine başka bir karektere basıldığında alınmasını sağlar.
-e Tüm satırın ReadLine gibi alınmasını sağlar.
-n num Tüm satırı okumak yerine num kadar karekter okunmasını sağlar.
-p prompt Kullanıcıya onay sorusu sorar.
-r Raw mod. ‘\’ karakterinin kaçış karakteri olarak kullanılmamasını temin eder.
-u fd girdinin standart giriş yerine fd file descriptordan alınmasını sağlar.
eğer read komutundan sonra hiçbir girdinin verileceği bir değişken atanmamışsa, otomatik olarak shell değişkeni olan REPLY değişkenine atanır.($REPLY yaılarak erişilebilir)


read -p "Enter one or more values &amp;amp;amp;amp;gt; "
echo "REPLY = '$REPLY'"
read ile aynı anda birden çok değer okuma

echo -n "Enter one or more values &amp;amp;amp;amp;gt; "
read var1 var2 var3 var4 var5
echo "var1 = '$var1'"
echo "var2 = '$var2'"
echo "var3 = '$var3'"
echo "var4 = '$var4'"
echo "var5 = '$var5'"

Aşağıdaki script kullanıcıya 10 sn içinde şifre gibi bir değer girmesini ister eğer 10 sn içinde istenilen değer girilmemişse hata vererek kapanır.

if read -t 10 -sp "Enter secret passphrase &gt;" secret_pass; then
   echo -e "\nSecret passphrase = '$secret_pass'"
else
   echo -e "\nInput timed out" &gt;&amp;2
   exit 1
fi

Aritmetik işlemler

Bash altında aritmetik işlemler için $(()) yapısı kullanılır.

echo $(( 100 / 3 ))
33
$ myvar="56"
echo $(( $myvar + 12 ))
68
x=8
y=4
z=$(($x + $y))
echo " $x + $y toplami= $z"

şimdi bir tek-çift sayı tespit edebilen bir script yazalım:

number=0
echo -n "Bir sayi giriniz > "
read number
echo "Girdiginiz Sayi $number"
if [ $((number % 2)) -eq 0 ]; then
    echo "Girdiginiz $number sayisi cifttir"
else
echo "Girdiginiz $number sayisi tektir."
fi

yukarıdaki scripti sayi.sh olarak (başına shebang eklemeyi unutmadan) kaydedip çalıştıralım.

$ ./sayi.sh
Bir sayi girini > 9
Girdiginiz Sayi 9
Girdiginiz 9 sayisi tektir.

şimdilik bukadar sonraki yazımda bash script ile dosya işlemlerine geçmeyi planlıyorum ozamana kadar esen kalın 🙂

Reklamlar

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Connecting to %s