11
Konuya ait anahtar kelimeler : Unix/Linux değişken tanımlama & declare, variable, constant, array, offset, Bu ders bir önceki konunun devamı niteliğinde olacaktır. declare : Değişken tanımlama komutu. Bir çok parametre alabilir. Bu komut ile değişken, sabit ve dizi tanımlayabilirsiniz.
-aArray(dizi) tanımlama.
-fFonksiyon isimleri için kullanılır.
-iSayısal değişken tanımlama.
-pDeğişken niteliklerini, tanımlanma şeklini,kriterlerini gösterme.
-rDeğişkenin sadece okunabilir(readonly) yani değerinin sabit olduğunu ayarlama.
-tHer değişkene trace(iz) niteliği verme.
-xHer değişkeni diğer komutlar için işaretleme.
Variable : Değişken.
[alax@alax ~]$ declare -i degisken=13 [alax@alax ~]$ echo $degisken 13 [alax@alax ~]$
yukarıdaki örnekte değişkeni sayısal olarak tanımladık. Bunun anlamı şudur: eğer siz bir değişkeni sisteme sayısal olarak tanımlarsanız, o değişken sadece sayısal değerler alabilir. "declare" kullanımının asıl amacı değişkenin türünü belirtmektir. Önceki konumuzdada değişken tanımlamıştık, fakat değişken değerleri istediğimiz zaman değişebiliyordu. Aşağıdaki örneği inceleyiniz.
[alax@alax ~]$ declare -i sayi=15 [alax@alax ~]$ echo $sayi 15 [alax@alax ~]$ sayi="Penguen" [alax@alax ~]$ echo $sayi 0 [alax@alax ~]$ declare -p sayi declare -i sayi="0" [alax@alax ~]$
Gördüğünüz gibi önce "sayi" adlı değişkeni sayısal olarak belirttik. Daha sonra bu değişkenimize değerini string(metinsel) türü bir değer atamaya çalıştık dolayısıyla sonuç "0" oldu hata aldık, en son komut ile değişkenin nasıl tanımlandığına baktık.
[alax@alax ~]$ degisen="Penguen" [alax@alax ~]$ declare -p degisken declare -- degisken="Penguen" [alax@alax ~]$
Yukarıdaki örneğimizde değişken türü belirtilmeden tanımlanmıştır, son komut çıktısı bize bunu söylüyor. Bunun anlamı istediğiniz şekilde bu değişkene değer atanabilir. İki tirenin olduğu kısım değişkenin tür bilgilerinin lduğu kısım. İki tire olması, herhangi bir tanımlamanın yapılmadığı anlamına gelir. Constants : Sabitler. Tanımlanmış olan değişkenin değeri sabittir. Değiştirilemez. Tanımlamak için "readonly" komutu kullanılır.
[alax@alax ~]$ readonly degisken="Penguen" [alax@alax ~]$ echo $degisken Penguen [alax@alax ~]$ degisken="Tux" bash: degisken: readonly variable [alax@alax ~]$
En son aldığımız hatanın anlamı, değişkenin readonly(sadece okunabilir, değiştirilemez) olduğudur. Arrays : Diziler. Birden fazla değişkeni barındıran bir dizi. Tanımlanmış olan bir dizinin özellikleri tüm elemanları için aynı olur. Bazı elemanları farklı özelliklere sahip olamaz. Dizilerde index(dizi numarası) her zaman sıfır(0) dan başlamaktadır. Eğer dizi indexi belirtilmemiş ise, dikkate alınmaz ve bir hata üretmez. Kullanım : declare -a dizi_adi şeklinde olmaktadır. Bundan farklı olarak diziler, Kullanım : dizi=(eleman1,eleman2,eleman3,...elemanN) şeklinde de tanımlanabilir. Tanımlanmış olan dizi değerlerine; Kullanım : ${dizi[index_numarası]} şeklinde ulaşılabilir. Mesela dizinin ilk elemanı ${dizi[0]}, ikinci elemanı ${dizi[1]} şeklinde olacaktır. Tanımlanmış olan dizi değerlerinin hepsine yıldız "*" yada et "@" karakteri ile ulaşabilir.
[alax@alax ~]$ dizi=(1 2 3 4 5) [alax@alax ~]$ echo ${dizi[0]} 1 [alax@alax ~]$ echo ${dizi[4]} 5 [alax@alax ~]$ echo ${dizi[*]} 1 2 3 4 5 [alax@alax ~]$ dizi[0]=55 [alax@alax ~]$ echo ${dizi[*]} 55 2 3 4 5 [alax@alax ~]$
Array değişken uzunluğu : Tanımlanmış olan dizi elemanının kaç karakterden oluştuğunu öğrenme işlemini, ${#dizi} taban kullanımı ile bulabiliriz. Bu kural sadece diziler için değil değişkenler ve sabitler içinde geçerlidir.
[alax@alax ~]$ echo $SHELL /bin/bash [alax@alax ~]$ echo ${#SHELL} 9 [alax@alax ~]$ dizi=(bir iki üç dört) [alax@alax ~]$ echo ${#dizi} 3 [alax@alax ~]$ echo ${#dizi[2]} 2 [alax@alax ~]$ echo ${#dizi[0]} 3 [alax@alax ~]$ echo ${#dizi[1]} 3 [alax@alax ~]$ echo ${#dizi[3]} 4 [alax@alax ~]$
Eğer index numarası ile herhangi bir dizi elemanı belirtilmezse ilk eleman işleme alınacaktır. Mesela örneğimizde de görüleceği üzere; dizimizin 3. elemanı 4 karakterden oluşmaktadır(üçüncü eleman: dört). Not : Tanımlanmış olan değişken ve diziyi tanımsız yapmak için, önceden de öğrendiğimiz üzere "unset" komutunu kullanabiliriz. Kullanımı değişken yada dizi adı ile olmaktadır. unset $dizi yukarıdaki örnek yanlıştır. unset dizi unset degisken_adı doğru kullanım yukarıdaki gibi olacaktır. ${degisken23:-xyz} İfadesinin anlamı; eğer "degisken23" adlı değişken tanımlanmamış yada değeri boş ise, değeri "xyz" olsun. Burada dikkat edilmesi gereken nokta, bu işlem değişkeninin kullanıldığı komutun bitimine kadar geçerli olacaktır.
[alax@alax ~]$ echo ${degisken5:-penguen} penguen [alax@alax ~]$ echo $degisken5 [alax@alax ~]$
Yukarıdaki örnekte, echo komutunun işlemi içerisinde "degisken5" adlı değişken tanımsız olduğu için değeri "penguen" olarak belirlenmiş ve ekrana yazılmıştır. echo komutu son bulduğu için "degisken5" adlı değişkeninin değeri tekrardan tanımsız haline geri dönmüştür. Bu ifadeyi daha sonra göreceğimiz "IF" koşulu anlatımında daha net anlayacaksınız. Eğer değişken değeri önceden belirlenmişse hiçbir atama yapılmayacaktır.
[alax@alax ~]$ deegisken5=555 [alax@alax ~]$ echo ${degisken5:-penguen} 555 [alax@alax ~]$
Değişken değerini kırpma : Tanımlanmış olan değişkenin belirli sayıda karakterini çekmek için kullanılan yöntem aşağıdaki gibi olmaktadır. ${degisken:offset:uzunluk} Offset : Kırpma işleminin başlanacağı yer. Uzunluk : Kırpma işeminin ne kadar yapılacağı. Boş bırakıldığı takdirde kırpma işlemi değerin sonuna kadar yapılacaktır. " ${degisken:10} " = "degisken" adlı değişken değerinin 10. karakterinden sonra hepsi. " ${degisken:10:5} " = "degisken" adlı değişken değerinin 10. karakterinden itibaren 5 karakter.
[alax@alax ~]$ degisken="burasıçokuzunbirdeğer" [alax@alax ~]$ echo ${degisken:6} çokuzunbirdeğer [alax@alax ~]$ echo ${degisken:10} zunbirdeğer [alax@alax ~]$ echo ${degisken:10:5} zunbi [alax@alax ~]$
Değişken değeri içerisinde silme : Aşağıdaki kullanım ile değişkenin değeri içerisinde birlediğiniz bir harfi, kelimeyi vb.. silebilirsiniz. Mesela bir komut dizisi ile bir değeri belirdlediğiniz değişkene aktardınız ve istemediğiniz kısımların silinmesini istiyorsunuz, ${degisken#kelime} ${degisken##kelime} Yukarıdaki ilk kullanım daha kısa kelimeler, ikinci kullanım ise uzun kelimeler için kullanılmaktadır. şimdi "array" adında bir dizi tanımlayalım ve bazı silme işlemleri yapalım. Yukarıda da belirttiğimiz üzere, herhangi bir dizinin tüm elemanlarını ifade etmek için index numarası yerine yıldız "*" yada et "@" işareti kullanılır. Bunun anlamı bütün elemanlar için uygula.
[alax@alax ~]$ array=(bir iki üç dört beş) [alax@alax ~]$ echo ${array[*]} bir iki üç dört beş [alax@alax ~]$ echo ${array[*]#bir} iki üç dört beş [alax@alax ~]$ echo ${array[*]#b} ir iki üç dört eş [alax@alax ~]$ echo ${array[*]##b*} iki üç dört [alax@alax ~]$
Belirlenen değişken değerinin son kısmından belirlenen kelimeyi silme işlemi yapar. Belirlenen kelime değerin son kısmında bulunmalıdır.
[alax@alax ~]$ _degisken851="birikiüçdörtbeşaltıyedisekizdokuzon" [alax@alax ~]$ echo $_degisken851 birikiüçdörtbeşaltıyedisekizdokuzon [alax@alax ~]$ echo ${_degisken851%üç} birikiüçdörtbeşaltıyedisekizdokuzon [alax@alax ~]$ echo ${_degisken851%on} birikiüçdörtbeşaltıyedisekizdokuz [alax@alax ~]$ echo ${_degisken851%dokuzon} birikiüçdörtbeşaltıyedisekiz [alax@alax ~]$
Değişken içerisinde kelime değiştirme : Değişkenin değeri içerisinde kırpma işlemi yerine değiştirme yapabilirsiniz. ${degisken/aranan_kelime/değiştirilecek_kelime} ${degisken//aranan_kelime/değiştirilecek_kelime} İlk kullanım, bir adet ters eğik çizgi ile, sadece ilk eşleşmeyi değiştirme, ikinci kullanım, iki adet eğik çizgi ile bütün eşleşmeleri değiştirme işlemi yapılır. Herhangi bir yazı içerisinde beş adet "skript" kelimesi olsun, tek eğik çizgi ile sadece ilk "skript" kelimesi değişikliğe uğrayacaktır. Bunun aksine çift ters eğik çizgi ile kullanıldığı zaman bütün eşleşen "skript" kelimeleri değişikliğe uğrayacaktır.
[alax@alax ~]$ echo $_degisken851 birikiüçdörtbeşaltıyedisekizdokuzon [alax@alax ~]$ echo ${_degisken851/on/onbir} birikiüçdörtbeşaltıyedisekizdokuzonbir [alax@alax ~]$ echo ${_degisken851/iki/2} bir2üçdörtbeşaltıyedisekizdokuzon [alax@alax ~]$
Değişken içerisinde kelime değiştirme yada silme işlemleri sadece o onki işlemler için geçerlidir. Orjinal değer değişmeyecektir. Değiştirme işlemi sadece istenilen yerde olacaktır, herhangi bir kaydetme durumu sözkonusu değildir. Mesela "degisken" adlı değişken değeri içerisinde kelimeleri değiştirip ekrana yazdırmak için bu yöntemi kullanıdığınız zaman, işlem sorunsuz olarak gerçekleşecek, Terminal ekranına değiştirilmiş veri yazılacaktır. Fakat orjinal veri kendini koruyacaktır. ileriki derslerimizde kalıcı olarak değiştirme işlemlerini göstereceğiz.