次の機能があります。
_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:
_
私の質問は、議論の引用をどのように保存できるかということです。これはまったく可能ですか?
"$@"
を使用:
$ bar() { echo "$1:$2"; }
$ foo() { bar "$@"; }
$ foo "This is" a test
This is:a
"$@"
および"$*"
には特別な意味があります。
"$@"
は、単語の拡張を実行せずに複数の単語に拡張します("$1" "$2" ...
など)。"$*"
は、定位置パラメーターをIFSの最初の文字(またはIFSが設定されていない場合はスペース、IFSが空の場合は何もない)と結合します。$@
の代わりに$*
を使用する必要があります
bar() { echo "$1:$2"; }
foo() { bar "$@"; }
foo "This is" a test
出力
This is:a
なぜ機能するのですか?
$*
を使用すると、すべてのパラメーターが単一の単語と見なされるため、This is a test
をbar
関数に渡すことになります。この場合、関数バーへの最初のパラメーターパスはThis
、2番目はis
です。
$@
では、各パラメータは引用文字列であり、'This is'
'a'
'test'
をbar
関数に渡すことを意味します。したがって、関数バーへの最初のパラメーターパスはThis is
、2番目はa
です。