## 基本はダブルクォーテーション付きの`"$@"` シェルスクリプトに渡された全ての引数を、そのシェルスクリプト内で別のコマンドに引き渡す場合は`"$@"`を使います。 例えば、以下のように記述します。 ```sh grep -n cat "$@" | sed "s/cat/__CAT__/g" | tee -a ~/foo.log ``` `"$*"`や`$@`(ダブルクォーテーションなし)を使うと、`'foo bar'`のようなスペースを含む引数がスペースで分割されて壊れてしまいます。 ## shコマンドに渡すときは`sh -c '..."$@"...' -- "$@"` 1つの実行コマンドしか受け付けない`sudo`や`ssh`、`docker run`などで、 複数コマンドの実行などの複雑な処理を行いたいときに活躍するのが`sh -c '...'`です。 シェルスクリプト内で`sh -c '...'`にすべての引数を渡したいときは、`sh -c '..."$@"...' -- "$@"`と記述します。 例えば、以下のように記述します。 ```sh sudo sh -c 'grep -n cat "$@" | sed "s/cat/__CAT__/g" | tee -a /var/log/foo.log' -- "$@" ``` ## 先頭のいくつかの引数を取り出して残りを渡す場合(おまけ) 検索ワードのような「固定の引数」と、複数のファイルのような「可変長の引数」が混在しているケースです。 これらをまとめて`sudo`や`ssh`、`docker run`などに投げたい場合は、 `-c`オプションの文字列内で`shift`を使います。 以下は、第一引数が検索文字列、第二引数がその検索文字列を置き換える先の文字列、 第三引数以降はこの検索と置換の対象となるファイル(複数個指定可)となっている例です。 ```sh sudo sh -c 'pattern="$1"; replace="$2"; shift 2; grep -n "$pattern" "$@" | sed "s/$pattern/$replace/g" | tee -a /var/log/foo.log' -- "$@" ```