
Linux komut satırında herhangi bir deneyiminiz varsa, yürütmekte olduğumuz bir komutun davranışını değiştirmemize yardımcı olan komut bayraklarıyla karşılaşmış olmalısınız.
Örneğin, ls -l komutunu çalıştırırsak, komutun -l kısmı, argüman olarak ls‘ye ilettiğimiz bir bayraktır. Bu aynı işlevsellik, bir Bash betiğinde kullanılabilir ve betiği çalıştırırken, komut dosyasına bazı girdileri bayraklar aracılığıyla iletmemize izin verir.
Bir Bash betiğinin davranışını, tıpkı normalde komut satırı programlarında yaptığımız gibi, çalışma zamanı seçenekleri aracılığıyla değiştirmek çok faydalı olabilir. Bash kabuğu, bunu başarmanın standart bir yolu olan getopts yerleşik komutunu sağlar. Bu öğreticide, getopts yerleşikini kullanarak bir Bash betiği çalıştırırken bayrakların argüman olarak nasıl kullanılacağını göreceksiniz.
Bu klavuz’da şunları öğreneceksiniz:
- Bayraklar aracılığıyla bir Bash betiğine argümanlar nasıl iletilir
getoptsaracılığıyla bayrak girişi nasıl yapılır
| Kategori | Gereksinimler, Kurallar veya Kullanılan Yazılım Sürümü |
| Sistem | Herhangi bir Linux dağıtımı |
| Yazılım | Bash kabuğu (varsayılan olarak yüklenir) |
| Diğer | Kök olarak veya sudo komutu aracılığıyla Linux sisteminize ayrıcalıklı erişim. |
| Sözleşmeler | # – verilen linux komutlarının, doğrudan bir kök kullanıcı olarak veya sudo komutu kullanılarak kök ayrıcalıklarıyla yürütülmesini gerektirir$ – verilen linux komutlarının, ayrıcalıklı olmayan normal bir kullanıcı olarak yürütülmesini gerektirir |
Bash Komut Dosyası: Kullanımı bağımsız değişkenlerle işaretler örneği
Bash betiğinde getopts kullanmanın temel bir örneğini inceleyelim. Burada pratikliği hedeflemiyoruz, sadece getopts‘un nasıl çalıştığını kolayca anlamanızı sağlayan basit bir komut dosyası.
Aşağıdaki komut dosyamızı -l, -h ve -a komut satırı seçeneklerini kabul edecek şekilde yapılandıracağız.
#!/bin/bash
while getopts 'lha:' OPTION; do
case "$OPTION" in
l)
echo "murhas"
;;
h)
echo "you have supplied the -h option"
;;
a)
avalue="$OPTARG"
echo "The value provided is $OPTARG"
;;
?)
echo "script usage: $(basename \$0) [-l] [-h] [-a somevalue]" >&2
exit 1
;;
esac
done
shift "$(($OPTIND -1))"Yukarıda sahip olduklarımızı analiz edelim. Her şeyden önce, getopts komutları bir süre döngüsü içinde kullanılmalıdır, böylece tüm seçenekler ayrıştırılır. Ardından getopts anahtar sözcüğünden hemen sonra, betiğimizin kabul edeceği olası seçenekleri tanımladık. Bunlar l, h ve son olarak a‘dır.
Bu son seçenekten sonraki kolon ne anlama geliyor? Bu, seçeneğin bir argüman gerektirdiğini getopts‘a söyleme şeklimizdir. Ayrıştırılan her seçenek $OPTION değişkeni içinde saklanırken, bir argüman mevcut olduğunda $OPTARG değişkeninin değeri olur.
Her seçenek, bir son ? mevcut olmayan bir seçenek sunulduğunda eşleştirilecek olan durum. Bu durumda, kullanıcıya doğru komut dosyası kullanımını tekrarlayacağız ve bir hata koduyla çıkacağız.
Komut dosyamızı test etme
İlk olarak, sadece yukarıda bahsettiğimiz durumu test etmek için mevcut olmayan bir seçenek sunan betiğimizi çağıracağız. Komut dosyasına yürütülebilir izinler verelim ve ardından onu çağıralım:
chmod +x test.sh && ./tesh.sh -c
Beklendiği gibi, bize sağlanan seçeneğin geçersiz olduğunu söyleyen bir mesaj ve ardından komut dosyasının nasıl kullanılacağına ilişkin talimatlar alacağız:
./test.sh: illegal option -- c
script usage: test.sh [-l] [-h] [-a somevalue]Komut dosyası kullanım dizesi, kullanım hatası üzerine yazdırılacak şekilde ayarladığımız dize olsa da, yukarıdaki geçersiz seçenek mesajı getopts tarafından otomatik olarak oluşturulur ve seçeneklere bir : ile ön ek getirilerek devre dışı bırakılabilir. Şimdi betiği olması gerektiği gibi kullandığımızda ne olacağını görelim:
./test.sh -l
murhas-ı seçeneğini kullandık ve komut dosyası ilgili durumda ayarladığımız dizeyi ekrana yazdırdı, -h seçeneğini sağlarsak bu da olur:
./test.sh -h
you have supplied the -h optionŞimdi betiği -a seçeneği ile çağırmayı deneyelim. Yukarıda belirtildiği gibi, bu seçenek bir argüman gerektirir ve ikincisi sağlanmazsa başarısız olur:
./test.sh -a
./test.sh: option requires an argument -- a
script usage: test.sh [-l] [-h] [-a somevalue]Beklendiği gibi, komut dosyası bir hata mesajıyla yanıt verdi ve bize sağladığımız seçeneğin bir argüman gerektirdiğini hatırlattı:
./test.sh -a tux
The value provided is tuxBu sefer komut dosyası hatasız yanıt verdi. Sağladığımız argümanın, tux’un nasıl yazdırıldığına dikkat edin, çünkü bu, $OPTARG değişkeninin değeri olur.
Getopts‘u kullanarak, betiğinizi başlattığınızda bayrakları birleştirerek aynı anda birden fazla seçenek sağlayabilirsiniz. Örneğin, betiklerimizi hem -l hem de -h seçenekleriyle çağırmaya çalıştığımızda ne olduğunu görelim:
./test.sh -lh
murhas
you have supplied the -h optionGördüğümüz gibi, her iki seçenek de sağladığımız sırayla işlendi. Elbette seçenekler ayrı ayrı verilebilir ve -a seçeneğini de ekleyebiliriz, ancak her zaman gerekli argümanı eklemeyi unutmayın:
./test.sh -l -h -a tux_rulez
murhas
you have supplied the -h option
The value provided is tux_rulez$OPTIND değişkeni
Yukarıda yazdığımız çok önemsiz komut dosyasına bir kez daha bakarsak, while döngüsünün sonunda başka bir talimat görürüz: shift $(($OPTIND -1)). Amacı nedir? Diyelim ki betiği şu şekilde adlandırıyoruz:
./test.sh -l -h -a hello worldKomut dosyası çağrıldığında, $OPTIND değişkeni 1’e ayarlanır ve bir seçenek her çözümlendiğinde, sonuncuya ulaşana kadar artırılır. Bu nedenle, bu durumda, -a seçeneğinin gerektirdiği zorunlu argüman olan hello olan son öğeye ulaştığında 5 değerine sahip olacaktır.
shift, komut dosyasının konum parametrelerini, kendisine pozitif bir sayı olarak sağlanan belirli sayıda konum aşağı hareket ettirerek ilgili bağımsız değişkenleri atan bir kabuk yerleşikidir.
Yukarıdaki betiği başlatma şeklimiz, son sağlanan argüman olan “world”, o noktada işini bitirmiş olan getopts tarafından ayrıştırılmaz.
Şimdi, konumsal parametrelerde $OPTIND - 1 (bu, ayrıştırılan seçeneklerin etkin sayısı, bu durumda 4) değerinde bir kaydırma yaparsak, bu durumda geriye yalnızca seçenek olmayan argümanlar kalır. Bu betikte daha sonra $* değişkenini kullanarak erişebileceğimiz
Kapanış
Bu klavuz’da bir Bash betiğine iletilen komut satırı argümanları olarak kullanılan bayrakların nasıl ayrıştırılacağını gördük. getopts Bash yerleşik yapısı, betiğimizin, bir Linux sisteminde varsayılan komutların çalıştığı gibi, aynı anda birden çok olsa bile komut bayraklarını kabul etmesine izin verir. Ayrıca, bu tür komut dosyasında kullanışlı olan ve ek girdileri işlememize izin veren $OPTIND yerleşikini de öğrendik.




