Parametreleri bash betiğindeki diğer komuta nasıl iletirim?


165

Benim bash betiğimin içinde, sıfır, bir veya iki parametreyi (komut dosyası tanıyabilir) ayrıştırmak, sonra kalan parametreleri komut dosyasında çağrılan bir komuta iletmek istiyorum. Bunu nasıl yapabilirim?

Yanıtlar:


239

shiftBağımsız değişkenleri "yemek" için yerleşik komutu kullanın. Daha sonra alt işlemi çağırın ve "$@"kalan tüm argümanları içerecek şekilde argümanı iletin. Bağımsız değişken listesinin genişletilmesinin düzgün bir şekilde alıntılanmasına neden olduklarından, tırnaklara dikkat edilmelidir.


23
aslında "$ @" $ * 'dan daha güvenlidir
pixelbeat

1
@pixelbeat: Teşekkürler, iyi yakaladın. Ben düzenledim. @ Asukasz Lew: kılavuzdaki bağlantılı sayfaya bakınız. :) Temelde, daha iyi alıntı yapar.
gevşeyin

22
$@temelde dizinin her bir elemanına alıntılanmış bir dize olarak davranır - genişleme fırsatı olmadan iletilirler. Ayrıca her birinin ayrı bir kelime olarak görülmesini sağlar. Farkı gösteren bir test komut dosyası ile birlikte bu açıklama burada: tldp.org/LDP/abs/html/internalvariables.html#APPREF
Cascabel

2
Tırnak kullanmaya dikkat edin! Bunların neden önemli olduğu hakkında daha fazla
bilgiyi

32

bash shift komutunu kullanır :

örneğin shifttest.sh:

#!/bin/bash
echo $1
shift
echo $1 $2

shifttest.sh 1 2 3 üretir

1
2 3

2
@ TamásZahola açıklamak ister misiniz?
Kyle Chadha

2
Argümanları $1tırnak işareti olmadan olduğu gibi iletirseniz "$1", kabuk sözcük bölme işlemini gerçekleştirir, bu nedenle örneğin ve ayrı foo barolarak iletilir . foobar
Tamás Zahola

Çifte sahip olmanın neden önemli olduğu hakkında daha fazla
bilgiyi

1
Beynim "shifttest" de birkaç harf karıştırdı ve sonuç olarak başka bir şey olarak okudum.
Alex

21

Bash, alt ayar parametrelerini destekler (bkz. Alt Kümeler ve alt dizeler ), böylece hangi parametrelerin bu şekilde işleneceğini / aktarılacağını seçebilirsiniz.

  1. yeni dosya aç ve düzenle: vim r.sh:

    echo "params only 2    : ${@:2:1}"
    echo "params 2 and 3   : ${@:2:2}"
    echo "params all from 2: ${@:2:99}"
    echo "params all from 2: ${@:2}"
  2. çalıştırın:

    $ chmod u+x r.sh
    $ ./r.sh 1 2 3 4 5 6 7 8 9 10
  3. sonuç:

    params only 2    : 2
    params 2 and 3   : 2 3
    params all from 2: 2 3 4 5 6 7 8 9 10
    params all from 2: 2 3 4 5 6 7 8 9 10
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.