Bash Kabuk Betikleme/Değişkenler
Bash betiklerinde değer barındırabilen birtakım parametreler vardır. Değişkenler de isimlendirilmiş parametre anlamına gelen önemli bir parametre türüdür. Herhangi bir imperative programlama diline (C, BASIC, Fortran, veya Pascal gibi) hakimseniz değişkenlerin ne olduğunu zaten biliyorsunuz demektir. Aşağıdaki basit betikte konum
isimli değişken dünya
değerini barındırır ve o ünlü "Merhaba, dünya!" mesajını yazdırır:
konum=dünya # "dünya" değerini "konum" değişkeninde sakla
echo "Merhaba, ${konum}!" # "Merhaba, dünya!" mesajını yazdır
Gördüğünüz gibi ikinci satırdaki ${konum}
ifadesi dünya
ile değiştirildi. Bu ikame işlemi değişken uzantısı (variable expansion) olarak bilinir ve deminki örnekten daha esnek durumlarda dahi kullanılabilir. Bir örnek vermek gerekirse çalıştırılacak komutun ismi bile değişken olarak tutulabilir:
komut=echo # "echo" değerini "komut" değişkeninde sakla
"${komut}" 'Merhaba, dünya!' # "Merhaba, dünya!" mesajını yazdır
Yukarıdaki iki örnekte de ${değişken_ismi}
ifadesini değişken uzantısı olarak kullandık. Parantez kullanılmadan yazılan $değişken_ismi
ifadesi de yukarıdaki örneklerde aynı işlevi görecektir, ancak bazı nadir durumlarda parantez gereklidir. Mesela ${foo}bar
ifadesi code>$foobar olarak yazılamaz çünkü son örnek ${foobar}
olarak yorumlanacaktır.
Tabii ki söylemeye gerek olmaksızın yukarıdaki örnekler çok da gerçekçi değil. Bu örnekler yalnızca değişkenlerin nasıl kullanılacağını gösteriyor ancak niçin veya ne zaman kullanılacaklarına değinmiyor. Eğer öbür imperative programlama dillerine aşinaysanız değişkenlerin hangi amaç ve zamanda kullanılacağını zaten az çok biliyorsunuz. Eğer bilmiyorsanız endişelenmeyin çünkü bu kitabı okuyup değişkenleri daha gerçekçi durumlarda kullanan örnekleri gördükçe aşinalık kazanacaksınız.
Tek tırnak '
yerine çift tırnak "
kullandığımızı fark etmiş olabilirsiniz. Bunun sebebi tek tırnağın değişken uzantısını engellemesinden kaynaklı. echo '${konum}'
gibi bir komut, konum
isimli değişkenin barındırdığı değer yerine ciddi ciddi ${konum}
ifadesini mesaj olarak yazdıracaktır.
Değişken uzantılarını çift tırnak içinde yazmak genelde iyi bir fikirdir, çünkü öbür türlü değişken uzantısının sonucu dosya ismi uzantısı olarak algılanacaktır ve kelime ayrıştırmasına (boşlukla ayrılan argümanların farklı komutlar olarak algılanması) maruz kalacaktır. Örneğin aşağıdaki betik örneğinde çıktı büyük ihtimalle istemediğimiz şekilde a ba.txt bd.sh
olarak yazdırılma ihtimaline sahiptir:
foo='a b*' # "foo" değişkeninde "a b*" ifadesini barındır
echo $foo
Gerçek hayatta kullanılan betiklerde çift tırnaklı ifadeleri gerekmedikçe kullanılmaz, ancak pratikte bu tercih bazı kafa karıştırıcı bug'lara yol açabilir.
İpucu: Değişken ifadelerini çift tırnak içine almak, örneğin |
Birtakım değişkenin özel anlamı vardır. Örneğin PATH
(yol) değişkeni, Bash harici bir program çalıştırırken araması gereken dizinlerin sırasını belirler. Eğer bu değişken /usr/bin:/bin
yolunu barındırıyorsa cp src.txt dst.txt
komutu çalıştırılmak için /usr/bin/cp
veya /bin/cp
konumuna bakacak. HOME
(ev) değişkeni mevcut kullanıcının ev dizininde hâlihazırda belirlenmiştir ve yaklaşık uzantıların davranışını belirler. Örneğin eğer bir betik ev dizinini HOME=/foo
olarak ayarlarsa echo ~/bar
komutu ev dizininin konumunu /foo/bar
olarak çıkartacaktır. (Ancak bu işlem, sistemin varsayılan ev dizinini değiştirmez.)