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 $var yerine "$var" yazmak genelde iyi bir fikirdir.

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