いくつかの方法で、複数の単語を1つのパラメーターにグループ化できます。
./my_spcript.sh 'a b c d'
./my_spcript.sh "a b c d"
./my_spcript.sh a\ b\ c\ d
基本的に、それらはすべて、パラメーター間の区切り文字ではなく、パラメーターの一部としてスペースを処理するようにシェルに指示することになります。a b c d
上記のすべては、$ 1をに設定し、$ 2、$3などを設定せずにスクリプトを実行します。
ただし、引用符なしで$ 1を展開すると、次のようになります。
echo_arguments $1
シェルは$1を展開してから再分割し、スペースをパラメーター間の区切り文字として扱います。したがって、my_spcript.shはa b c d
単一のパラメーターとして取得しますが、echo_argumentsは各文字を個別のパラメーターとして取得します。通常、これを修正する最善の方法は、$ 1を二重引用符で囲んで、再分割されないようにすることです(そして、他のおそらく望ましくない漂遊解析も防止します)。
echo_arguments "$1"
原則として、変数を置き換えるときは常に、発生している種類の問題を防ぐために、変数を二重引用符で囲む必要があります。追加の解析が必要な場合があるため、二重引用符は必要ありません。ただし、シェルに追加の解析を実行させる特別な理由がない限り、頭痛の種を減らすために二重引用符を使用してください。
特定の例では、これを「修正」する別の方法は、echo_argumentsに、最初の引数だけでなく、すべての引数をエコーさせることです。
echo_arguments() {
echo "$@"
}
現在のスクリプト/関数のすべての引数に展開され、それぞれが渡されるコマンド/関数への個別の引数として扱われることに注意して"$@"
ください(基本的に、それらはそのまま渡されます)。