Bir kabuk komut dosyası çalıştırırken, belirli konum parametrelerini sırayla girmek zorunda kalmadan geçirmek mümkün müdür?


13

Ö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ı?


1
Bu nedenle, çok fazla parametreniz varsa programlar genellikle konumsal parametreler yerine seçenekler kullanır.
Barmar

Yanıtlar:


4

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

ÇIKTI

$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 $eightboş 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 $eightde şö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 $eightde 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 *

ÇIKTI

$eight = file008

Orada sadece sekizinci işleneni görüyoruz, ancak test dizinimden 101 tanesi var.


18

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 getoptsyarar, veya programı getopt. bash- çoğu mermi gibi - getoptsyerleş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.


5
+1için getopt(s). Konumsal parametreler üzücü bir zamandır ve bundan kaçınılmalıdır.
HalosGhost
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.