引数をそのままの状態で機能させる


10

次の機能があります。

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

この関数を別の関数から呼び出していますfoofooそれ自体は次のように呼び出されます。

foo "This is" a test

次の出力を取得します。

This is:a

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

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

  • foo() { bar $*; }

    –出力: this:is

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

    –出力: this is a test:

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


回答:


14

使用"$@"

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

"$@"そして"$*"特別な意味があります:

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

おかげで、私は$*このセマンティックが存在することを認識していませんでした–今では論理的です。この答えは、配列を反復するときに私が抱えていた別の問題を実際に解決すると思います…
Konrad Rudolph

6

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

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

foo() { bar "$@"; }

foo "This is" a test

出力

This is:a

なぜ機能するのですか?

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

では$@、各パラメータは引用符付きの文字列です。つまり'This is' 'a' 'test'bar関数に渡されます。したがって、関数バーへの最初のパラメータパスはThis is、2番目はaです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.