Bash Kabuk Betikleme/Konumsal Parametreler

Yukarıdaki çoğu komutta (hem dahili hem de harici program çalıştıranlar) komutun ne yapması gerektiğini belirten bir ya da daha fazla argüman sağladık. Örneğin yaygın bir Unix aracı olan mkdir (make directory = dizin oluştur) yeni bir dizin oluşturmak için çağırdığımız zaman şöyle bir komut kullanırız:

mkdir tmp

Bu komutta tmp oluşturmak istediğimiz dizinin ismidir.

Ve daha önce de gördüğümüz gibi Bash betiklerinin kendileri çalıştırılabilir programlardır. Yani söylemeye gerek olmadan anlaşılacağı üzere betikler de aynı öbür programlar gibi argümanlara sahip olabilir. Bu argümanlar programda konumsal parametreler olarak kullanıma müsaittir. Konumsal parametreler argümanlar ile çok benzerlerdir, ancak kelime yerine sayı ile tanımlanırlar. Örneğin $1 (veya ${1}) betiğin ilk argümanı olarak uzantılanabilir. Mesela diyelim ki dosyayrt.sh isminde, bir dosya ismi ile metin içeren iki argüman alan ve belirtilen dosya ile belirtilen dosyayı oluşturan basit bir betik oluşturmak istiyoruz. Bu betiği şu şekil yazabiliriz:

#!/bin/bash
echo "$2" > "$1"

(Fark ettiyseniz #!/bin/bash satırı dosyanın başında. Bu satıra Basit komutlar bölümünde değinmiştik. Bu kodu çalıştırdığınız vakit bu satır betiğin Bash kabuğu tarafından çalıştırılacağını garantileyecek.)

Betiği chmod +x dosyayrt.sh komutunu çalıştırarak program olarak çalıştırılabilir hale getirdikten sonra şu komut ile programımızı çalıştırabiliriz:

./dosyayrt.sh yaratılacak-dosya.txt 'dosyaya konulacak satır'

Tüm argümanlara bir seferde değinmek için tüm konumsal parametrelere sırayla uzantılanabilen $@ ifadesini de kullanabiliriz. "$@" şeklinde çift tırnak içine alındığı takdirde her argüman ayrı bir kelimeye dönüşür. (Not: alternatif olarak kullanılabilen $* büyük ihtimalle daha yaygın, ancak "$*" şeklinde tırnak içine alındığında orijinal parametreler ile arasında boşluk olmasıyla tek kelime sayılıyor. Bir argümanın arada boşluk olması kaydıyla birden fazla kelimeye bölünmesine izin veren "$@" ifadesi neredeyse her zaman $@ veya $* ifadelerine karşı tercih edilir.) Bu kullanım shift gibi ilk konumsal parametreyi silen, örneğin $2'nin $1 ve $3'ün $2'ye falan dönüştüğü dahili komutlarda işe yarar. Örneğin eğer daha önce oluşturduğumuz dosyayrt.sh programını aşağıdaki gibi değiştirirsek:

#!/bin/bash
dosya="$1" # ilk argümanı "$dosya" olarak kaydet
shift # "$@" ifadesinden ilk argümanı düşür
echo "$@" > "$dosya" # kalan argümanları "$file" ifadesine yaz

programı şu şekil çalıştırabiliriz:

./dosyayrt.sh yaratılacak-dosya.txt dosyaya konulacak satır

ve dosya ismi hariç tüm argümanlar dosyaya yazılır.