İşlevleri tam olarak olduğu gibi iletmek için bağımsız değişkenler iletme


10

Ben aşağıdaki işlevi var:

bar() { echo $1:$2; }

Bu işlevi başka bir işlevden çağırıyorum foo. fookendisi şöyle denir:

foo "This is" a test

Aşağıdaki çıktıyı almak istiyorum:

This is:a

Yani, alınan argümanlar barbenim geçirdiğim jetonlarla aynı olmalıdır foo.

Bunu foobaşarmak için nasıl uygulanması gerekir? Aşağıdaki iki uygulamayı denedim, ancak ikisi de çalışmıyor:

  • foo() { bar $*; }

    - çıktı: this:is

  • foo() { bar "$*"; }

    - çıktı: this is a test:

Sorum, tartışmaların alıntılarını nasıl koruyabileceğim. Bu hiç mümkün mü?


Yanıtlar:


14

Kullanım "$@":

$ bar() { echo "$1:$2"; }
$ foo() { bar "$@"; }
$ foo "This is" a test
This is:a

"$@"ve "$*"özel anlamları var:

  • "$@"(genişletme) için genişletme yapmadan birden çok kelimeye genişler "$1" "$2" ....
  • "$*" konum parametrelerini IFS'deki ilk karakterle birleştirir (veya IFS ayarlanmamışsa boşluk veya IFS boşsa hiçbir şey).

Teşekkürler, $*bu semantik olduğunu bilmiyordum - şimdi mantıklı. Sanırım bu cevap diziler üzerinde yineleme yaparken yaşadığım başka bir sorunu çözüyor ...
Konrad Rudolph

6

Sen kullanmalıdır $@yerine,$*

bar() { echo "$1:$2"; }

foo() { bar "$@"; }

foo "This is" a test

çıktıya

This is:a

Neden çalışıyor?

İle Çünkü $*bütün parametre olarak görülüyor, tek kelimeyle , bu geçecek anlamına This is a testüzere barişlevi. Bu durumda, fonksiyon çubuğuna 1. parametre geçişi This, 2. parametre is.

İle $@, her parametre olduğunu alıntılanan dize , size geçecek anlamına 'This is' 'a' 'test'etmek barfuntion. Yani fonksiyon çubuğuna 1. parametre geçişi This is, 2. parametre a.

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.