21
Konuya ait anahtar kelimeler : BASH çevresel değişkenler, özel parametreler /etc/profile: Shell programını çalıştırdığımız zaman bazı özel tanımlı değişkenler, sistem değişkenleri ve özel karakterler gibi verileri BASH, "/etc/profile" dosyasından okumaktadır. Bu dosyada bazı özel değişkenler bulunmaktadır "PATH, USER, MAIL, HOSTNAME vb..". Bu dosya içeriğini "cat /etc/profile" komutu ile görebilirsiniz. Birçok sistemde, "umask" değeri /etc/profile dosyasında bulunmaktadır, bunun yanında bazı sistemlerde bu değer "/etc/inputrc" dosyasında "/etc/profile.d" klasörü içerisinde bulunabilir. umask, yeni oluşturulan dosya ve klasörlere erişim haklarını belirleyemeye yaramaktadır. Varsayılan değeri "022" dir. Bu değerler okuma,yazma haklarını belirtmektedir. Bu sayısal ifadeleri önceden dosya/klasör izinleri(chmod,chown,chgrp) derslerimizde ayrıntılı olarak işlemiştik. ~/.bash_profile: Kullanıcıya ait özel tanımlamaların olduğu dosyadır. Barındırdığı verileri ".bashrc" dosyasından okumaktadır. Bazen ".bashrc" yanında ".bash_login" dosyasından da verileri okuyabilir. ~/.bashrc Dünya üzerinde Linux kullanıcıları genellikle Shell olarak BASH kullanmaktadır. Bizlerde derslerimizde BASh kullanıyoruz. Bu dosya açmış olduğumuz Shell in ayarlarını okuduğu dosyadır. Önceki derslerimizde "alias" tanımlarımızı kalıcı olarak tanımladığımız zaman bu işlemi ".bashrc" dosyasında yapmıştık. Eğer sisteminizde kendinize özel tanımlamalar yaparak BASH komutlarında kullanmak istiyorsanız, bunu ".bashrc" ayar dosyası ile kolayca yapabilirsiniz. Şimdi ".bashrc" dosyamıza bir göz atalım.
[alax@alax ~]$ cat ~/.bashrc # # ~/.bashrc # # If not running interactively, don't do anything [[ $- != *i* ]] && return alias ls='ls --color=auto' PS1='[\u@\h \W]\$ »» ' alias tux='echo Penguen' alias cdd='cd ~/tux/script' [alax@alax ~]$
Gördüğünüz üzere önceden tanımladığımız kısayollar alt iki satırda duruyor. Siz Terminal'i açtıktan sonra "cdd" yazdığınız zaman otomatik olarak çalışma dizinine(~/tux/script) geçiş yapıyoruz. Bu dosya üzerinde birçok değişken, kısayol tanımlayarak çalışma performansınızı arttırabilirsiniz. Çevresel Değişkenler:
$*1 den başlayarak bütün pozisyondaki verileri gösterir. Eğer değer çift tırnak arasında ise çift tırnak arasındaki değerin hepsi bir değer olarak algılanır.
$@1 den başlayarak bütün pozisyondaki verileri gösterir. Eğer değer çift tırnak arasında ise çift tırnak arasındaki değerin hepsi bir değer olarak algılanır. Pek kullanılmaz. Dizi değişkenlerinde daha sık kullanılır.
$#Bütün pozisyondaki verilerin sayısını ifade etmektedir.
$?Ana Shell de çalıştırılan en son komutun çıkış durumunu belirtir.
$-Bir önceki çalışma dizinine geçiş yapmak. "set" ile tanımlanabilir, yada Shell tarafından özel olarak tanımlanabilir.
$$Shell ID sini göstermektedir. ID bir nevi kimlik numarasıdır.
$!Arka planda çalışmış olan son komutun ID sini göstermektedir.
$0Shell adını göstermektedir.
$_Alt çizgi, en son kullanılan komuta ait son parametreyi göstermektedir.
"$*" ve "$@" çoğu zaman aynı işlevi yapmasından dolayı bir karmaşıklığa neden olmaktadır. Kodlama yaparken genellikle "$*" kullanılmaktadır. Şimdi bir örnek yapalım. "degisken.sh" adında bir script dosyası oluşturalım ve içeriğini aşağıdaki gibi düzenleyerek kaydedelim.
[alax@alax ~]$ cdd [alax@alax script]$ > degisken.sh [alax@alax script]$ nano degisken.sh #!/bin/bash # degisken.sh # Bu script verilen dört değişkeni okuyarak ekranda yazdıracaktır. echo "$1 ilk pozisyondaki değişkendir, \$1" echo "$2 ikinci pozisyondaki değişkendir, \$2" echo "$3 üçüncü pozisyondaki değişkendir, \$3" echo "$4 dördüncü pozisyondaki değişkendir, \$4" echo echo "Bütün pozisyondaki değerlerin sayısı : $#" [alax@alax script]$
Şimdi dosyamıza yalnızca sahibi tarafından çalıştırılma izni verelim ve ardından bazı değerler ile scriptimizi çalıştıralım.
[alax@alax script]$ chmod u+x degisken.sh [alax@alax script]$ ./degisken.sh bir iki üç dört beş bir ilk pozisyondaki değişkendir, $1 iki ikinci pozisyondaki değişkendir, $2 üç üçüncü pozisyondaki değişkendir, $3 dört dördüncü pozisyondaki değişkendir, $4 Bütün pozisyondaki değerlerin sayısı : 5 [alax@alax script]$
Şimdi diğer çevresel değişkenleri kullanarak örnekler yapalım.
[alax@alax script]$ ls ~/tux/script a_dosya.txt degisken.sh script1.sh script4.sh selam.txt awkex _dosya.txt script2.sh sedex awk.txt komut.awk script3.sh sed.txt [alax@alax script]$ echo $_ /home/alax/tux/script [alax@alax script]$ echo $$ 1230 [alax@alax script]$ firefox & [alax@alax script]$ echo $! 4022 [alax@alax script]$ echo $0 bash [alax@alax script]$ echo $? 0 [alax@alax script]$ ls blablabla ls: cannot access blablabla: No such file or directory [alax@alax script]$ echo $? 1 [alax@alax script]$
Gördüğünüz gibi değişkenlerin çıktılarını çok kolay bir şekilde kullanabiliyoruz. Eğer son komut bir hata karşılaşırsa "$?" değeri sıfırdan farklı olacaktır. Her hatasız komut ile bu değer tekrar sıfırlanacaktır. Parantez - Süslü Parantez: Normal parantezler içerisinde komut, aralık vb.. değerler kullanılır çoğu zaman. Eğer normal parantezler içerisinde özel karakterler ile belirli durumlarda bir tanımlamalar yapılmış ise o zaman normalin dışına çıkarlar. Normal parantez içerisinde bir komut çalıştırabilirsiniz yada bir harf aralığı belirleyebilirsiniz vb.. Süslü parantezler ise genellikle belirli bir işlevin olmasını sağlamaktadır. Mesela "cut" adında bir değişken tanımlanmamış ve bu değişkenin değeri "Merhaba" olsun, eğer değişken tanımlanmış ise o zaman hiçbir değişiklik olmasın. Şimdi bu işlemi yapmak belki zor görülebilir, yada bunun için ayrı bir fonksiyon yazılması gerekebilir. Fakat süslü parantezler ile bu durumu çok kolay halledebiliriz. Şimdi "cut" değişkenini "Selam" değeri ile tanımlayalım ve örneğimizi gerçekleştirelim.
[alax@alax script]$ cut="Selam" [alax@alax script]$ echo $cut Selam [alax@alax script]$ echo ${cut:=Merhaba} Selam [alax@alax script]$
Gördüğünüz gibi "cut" değişkeni önceden tanımlandığı için değeri "Merhaba" olmadı. Peki şimdi önceden tanımlanmamış olan bir değişkeni bu yöntemle tanımlamaya çalışalım.
[alax@alax script]$ echo ${_degisken99:="Merhaba Dünya"} Merhaba Dünya # Değer atandı. [alax@alax script]$ echo ${_degisken99:="Selam Dünya"} Merhaba Dünya # Değer atanmadı. [alax@alax script]$
Şimdi sırasıyla "kalem, kağıt, kale, kasırga" kelimelerini yazdırma işlemini süslü parantezler ile yapalım. Burada süslü parantezlerin ne yaptığını örneğe bakarak kolayca anlayabilirsiniz.
[alax@alax script]$ echo ka{lem,ğıt,le,sırga} kalem kağıt kale kasırga [alax@alax script]$
Gördüğünüz üzere süslü parantez dışındaki kelimeye parantez içerisindeki kelimeleri teker teker ekleyerek yazdırdı. Komut Durumu: Bazen bir değişkene bir komutun çıktısını atamak isteyebilirsiniz yada komutun çıktısını bir değer olarak elde etmek isteyebilirsiniz. Bunun bir kaç yöntemi bulunmaktadır. $(komut) yada `komut` şeklinde bunu yapabilirsiniz. Script dosyaları içerisinde de bir komutun değerini çekmek istiyorsanız bu kullanımlardan birini kullanmalısınız. İleriki derslerimizde bu tip kullanımları fazlasıyla kullanacağız. Şimdilik bunu bilmeniz gereken bir durum olarak hafızanıza atınız.
[alax@alax script]$ echo date date [alax@alax script]$ echo $(date) Mon Nov 16 23:57:31 UTC 2015 [alax@alax script]$ echo `date` Mon Nov 16 23:57:31 UTC 2015
Tarih bilgisini yukarıdaki gibi echo ile gösterebiliriz. Aritmetik İşlemler: Matematiksel ifadeleri göstermek için $(( ifade )) şeklinde bir kullanım bulunmaktadır. Bildiğiniz tüm matematik durumları sisteminizde tanımlanmıştır. Şimdi bu aritmetik ifadeleri yazalım.
degisken++ yada degisken--Değişkeni bir arttır yada azalt. POST.
++degisken yada --degiskenDeğişkeni bir arttır yada azalt. PRE.
+ ve -Toplama ve çıkarma.
! ve ~Mantıksal ve bit düzeyinde karşıtlık.
**Üst alma.
*, /, %Çarpma, bölme, mod alma.
<< ve >>Bit düzeyinde sağ ve sol ileri ve geri.
<=, >=, < ve >Karşılaştırma. Küçük eşit vb..
== ve !=Eşittir ve eşit değildir.
&Bit düzeyinde AND (ve).
|Bit düzeyinde OR (yada).
^Bit düzeyinde hariç hesaba dahil edilmeyen OR (yada) .
&&Mantıksal AND (ve).
||Mantıksal OR (yada).
expr ? expr : exprKoşullu değerlendirme.
=, *=, /=, %=, +=, -=, <<=, >>=, &=, ^=, |=Görevler.
,Virgül, ifadeler arası ayraç.
x ve y iki adet sayı olsun. x=5 olsun: y = ++x; # x=6 ve y=6 olur. y = x++; # x=7 ve y=6 olur. x=3 olsun. y = x--; # x=2 ve y=3 olur. y = --x; # x=1 ve y=1 olur.
Yukarıdaki anlatımı şu şekilde özetleyebiliriz.
( y = x++ )

(1) y = x

(2) x = x + 1
( y = ++x )

(1) x = x +1

(2) y = x
( y = x-- )

(1) y = x

(2) x = x - 1
( y = --x )

(1) x = x -1

(2) y = x
Yukarıdaki tabloda işlem sırasına dikkat ediniz. İşlemler iki işlem olarak gerçekleşiyor. Son değişken, bir önceki işlem sonucuna göre bir değer alıyor. Eğer işaretler değişkenin solunda ise arttırım/azaltım işlemi yapıldıktan sonra o değişken ile eşitlendiği değişken değerleri birbirine eşit oluyor. Yok eğer işaretler değişkenin sağında ise eşitlenen değişkenen(y) değişkenin(x) ilk değerine sahip oluyor, değişken ise arttırım/azaltım sonucuna eşit oluyor. Şimdi diğer örneklere geçelim. Aritmetik ifadeleri iki parantez içerisinde yazma işini tek köşeli parantez ile de yapabiliriz. $[ ifade ]
[alax@alax script]$ echo $(( 5+8 )) 13 [alax@alax script]$ echo $[ 5 + 8 ] 13 [alax@alax script]$ x=13 # x 13 olarak tanımlanıyor. [alax@alax script]$ echo $((x+=5)) 18 # artık x değeri 18 [alax@alax script]$ echo $((x-=7)) 11 # x değeri 11 [alax@alax script]$ echo $[13 %5] 3 [alax@alax script]$ echo $[13/5] 2 [alax@alax script]$ echo $((5**2)) 25 [alax@alax script]$
( x+=y ) = ( x = x + y ) ( x-=y ) = ( x = x - y ) ( x/=y ) = ( x = x / y ) ( x*=y ) = ( x = x * y ) ifadelerini bu şekilde açıklayabiliriz. İleriki derslerimizde diğer ifadeler dahil olmak üzere bu aritemetik ifadeleri bolca kullanacağız. Şimdilik karmaşık gelebilecek olan önemli noktalarını anlattık.