
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
getopts
aracı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 tux
Bu 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 option
Gö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 world
Komut 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.