web-dev-qa-db-ja.com

引数をそのまま関数に渡す

次の機能があります。

_bar() { echo $1:$2; }
_

another function、fooからこの関数を呼び出しています。 foo自体は次のように呼び出されます。

_foo "This is" a test
_

次の出力を取得します。

_This is:a
_

つまり、barが受け取る引数は、fooに渡すトークンと同じでなければなりません。

これを達成するためにfooをどのように実装する必要がありますか?次の2つの実装を試しましたが、どちらも機能しません。

  • foo() { bar $*; }

    –出力:_this:is_

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

    –出力:_this is a test:_

私の質問は、議論の引用をどのように保存できるかということです。これはまったく可能ですか?

10
Konrad Rudolph

"$@"を使用:

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

"$@"および"$*"には特別な意味があります。

  • "$@"は、単語の拡張を実行せずに複数の単語に拡張します("$1" "$2" ...など)。
  • "$*"は、定位置パラメーターをIFSの最初の文字(またはIFSが設定されていない場合はスペース、IFSが空の場合は何もない)と結合します。
13
Lri

$@の代わりに$*を使用する必要があります

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

foo() { bar "$@"; }

foo "This is" a test

出力

This is:a

なぜ機能するのですか?

$*を使用すると、すべてのパラメーターが単一の単語と見なされるため、This is a testbar関数に渡すことになります。この場合、関数バーへの最初のパラメーターパスはThis、2番目はisです。

$@では、各パラメータは引用文字列であり、'This is''a''test'bar関数に渡すことを意味します。したがって、関数バーへの最初のパラメーターパスはThis is、2番目はaです。

6
cuonglm