可変数のパラメーターを含むスクリプトがあります。また、同じパラメータを使用して追加するラッパースクリプトもあります。問題は、パラメータにスペースがあるときに「内部」スクリプトに渡されると単語に分割されることです。
たとえば、外部スクリプトは次のようになります。
# tst1.sh
echo "-- tst1.sh --"
echo "1: $1"
echo "2: $2"
./tst2.sh $* --some --more --params
内部スクリプトは次のとおりです。
#!/bin/bash
echo "-- tst2.sh --"
echo "1: $1"
echo "2: $2"
ラッパースクリプトを呼び出すと、次の結果が表示されます。日付単一の引数は正確ですが、内部引数は最初の単語のみを取得します。
$ ./tst1.sh --date "$(date)"
-- tst1.sh --
1: --date
2: Fri Jan 25 21:51:57 GMT 2019
-- tst2.sh --
1: --date
2: Fri <== this is wrong
2番目のスクリプトの出力が最初のスクリプトと同じになりたいです。これらはすべて様々な数の引数に対応しています。これがすぐに$*
引用できる単一引数の代わりにを使用する理由です$1
。$2
引用しようとしましたが、実際の日付文字列が単一のパラメータにリンクされました"$*"
。--date
何をすべきか知っていますか?
ベストアンサー1
使用"$@"
:
./tst2.sh "$@" --some --more --params
$*
との違いは"$@"
次$*
のとおりです。単一文字列すべての位置パラメータの接続で構成されます。ここで、最初の文字は$IFS
区切り文字です(この文字列は引用符がないため、追加でトークン化され、ファイル名が拡張されます)。"$@"
(二重引用符に注意してください!)各位置パラメータの区切り文字になります。一人で引用。
個々の位置パラメータを保存したい場合は常に使用してください"$@"
。
$IFS
生成する最初の文字に位置パラメータを追加したい場合単一文字列、使用"$*"
。テキスト文字列を生成するとき、特定の状況を除いてほとんど使用されません。
$*
それを使用または引用しないことはほとんど意味がありません$@
。
"$@"
vs.の短い例"$*"
:
set -- "bumblebee 1" "bumblebee 2"
IFS=,
printf 'With "$@": %s\n' "$@"
printf 'With "$*": %s\n' "$*"
出力(説明を追加)
With "$@": bumblebee 1 <-- "$1" here
With "$@": bumblebee 2 <-- "$2" here
With "$*": bumblebee 1,bumblebee 2 <-- "$1$IFS$2" here