関数に引数を渡すときに、パラメーターを単一の引数にグループ化する方法は? 例
私のスクリプトファイル「my_script.sh」に次のような機能がある場合
echo_arguments() {
echo $1
}
echo_arguments $1
Unixコマンドラインで、パラメータを単一の引数として指定する方法は?
./my_spcript.sh a b c d #these "a b c d" must fit in $1
いくつかの方法で、複数の単語を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 "$@"
}
現在のスクリプト/関数のすべての引数に展開され、それぞれが渡されるコマンド/関数への個別の引数として扱われることに注意して"$@"ください(基本的に、それらはそのまま渡されます)。
引数を引用符で囲むと、引数にスペースを含めることができます./my_spcript.sh 'a b c d'。スクリプト内で同じことをもう一度行う必要があります。
# my_script.sh
echo_arguments() {
echo $1
}
echo_arguments "$1"
他の人が述べたように、$@ (および $*) は、すべてのコマンド ライン引数をグループとして参照する他の方法を提供します。たとえば、Bash の詳細については、http://tldp.org/LDP/abs/html/internalvariables.htmlを参照してください。
これらをスクリプト内の単一の引数にしたい場合は、引用符(シングルまたはダブル)で渡します。
./my_script.sh 'a b c d'
代わりに、それらを個別の引数として解析したいが、スクリプトへのすべての引数をスクリプト内の関数に渡したい場合は$@、それらすべてを一度に参照するために使用できます。
echo_arguments() {
echo "$@"
}
echo_arguments "$@"
適合するかどうかはわかりませんが、bash で「var args」を使用してみてください。
echo_arguments() {
echo ${@:1:4}
}
echo_arguments ${@:1:4}
これにより、最初の 4 つのパラメーターが展開されます。