Örneğin, 10 parametre alan bir komut dosyası ./foo varsa ve yalnızca 8. parametreyi geçmek istiyorum. Bunu şu anda nasıl yapacağımı bilmenin tek yolu:
./foo '' '' '' '' '' '' '' 'bar'
Daha kolay / daha iyi bir yol var mı?
Örneğin, 10 parametre alan bir komut dosyası ./foo varsa ve yalnızca 8. parametreyi geçmek istiyorum. Bunu şu anda nasıl yapacağımı bilmenin tek yolu:
./foo '' '' '' '' '' '' '' 'bar'
Daha kolay / daha iyi bir yol var mı?
Yanıtlar:
Bu şeyi yapmanın başka bir yolu, bildirmek istediğiniz parametreyi adlandırmak ve sonra yapmaktır:
{ cat >./foo
chmod +x ./foo
eight=declared ./foo
eight=declared_and_preferred \
./foo 1 2 3 4 5 6 7 8
./foo 1 2 3 4 5 6 7 8
./foo
} <<\SCRIPT
#!/usr/bin/sh
: ${eight:=${8:-some_default}}
printf '$eight = %s\n' "$eight"
#END
SCRIPT
$eight = declared
$eight = declared_and_preferred
$eight = 8
$eight = some_default
Yukarıdaki örnekte, açıkça bildirilen ortam değişkeni komut satırı bağımsız değişkenine tercih edilir, ancak ortam değişkeni boş veya ayarsız olduğunda komut satırı bağımsız değişkeni kullanılır. Hem 8. konum hem de ortam değişkeni $eight
boş olduğunda ya da bazı_default'a atanmış varsayılan değer ayarlandığında$eight
. Her iki durumda da :
, boşsa :-
veya :=
ifadelerinden çıkarılabilir kabul edilebilir bir değer olmalıdır.
Değişken $eight
de şöyle ayarlanmış olabilir:
printf '$eight = %s\n' "${eight:=${8:-some_default}}"
... ve önceki satır tamamen atlanmıştı, ancak bir değişkenin bu şekilde bildirilmesinin kalıcı bir değerle sonuçlandığını göstermek istedim ve iki komutla yaptım. Her iki şekilde $eight
de bu bileşik parametre genişlemesinin nihai değerine ayarlanır.
getopts
- sağlam komut dosyaları için - çoğu zaman komut seçeneklerini işlemenin en iyi yoludur . Diğer yandan, konumsal parametreler neredeyse her zaman bir komut dosyasındaki işlenenleri sağlam şekilde işlemenin en basit yoludur .
Örneğin:
touch file$(seq -ws\ file 100)
./foo *
$eight = file008
Orada sadece sekizinci işleneni görüyoruz, ancak test dizinimden 101 tanesi var.
Komut dosyasını değiştirebileceğiniz varsayıldığında, gerekli parametreler (bağımsız değişkenler) yerine isteğe bağlı parametreler (seçenekler) kullanmayı düşünmelisiniz.
Seçenek olarak ilk 7 yedi parametrenin her birine sahipseniz ve bunları varsayılan olarak boş dizeye sahipseniz, şunları yapabilirsiniz:
./foo bar
Eğer bir kullanırsanız POSIX uyumlu kabuk kullanabilirsiniz getopts
yarar, veya programı getopt
. bash
- çoğu mermi gibi - getopts
yerleşik olarak sunar . Her iki şekilde de kendi komut satırı ayrıştırıcıyı döndürmekten daha kolaydır.
Son X olmayan seçenek bağımsız değişkenleri gibi bir şey uygulamadığınız sürece, son Y bağımsız değişkenleri ve XY seçenek bağımsız değişkenlerinin değerleri, bunlardan herhangi birini ayarlamak istiyorsanız, 7 (şimdi boş) dizenin her birinden önce seçenek dizeleri sağlamanız gerekir. Ancak bu yaygın bir uygulama değildir, normalde bir seçenek her zaman bir seçenektir ve bir bağımsız değişkendir ve "ekleme" seçeneğinin sırası ücretsizdir.
+1
için getopt(s)
. Konumsal parametreler üzücü bir zamandır ve bundan kaçınılmalıdır.