"$ @"(ドルで引用)を使用して、パラメーターを添え字に渡します。そのようです ....
ls-color.sh:
#!/bin/bash
/bin/ls --color=auto "$@" # passes though all CLI-args to 'ls'
理由について....
以下からのBashのmanページ:
$*
-1つから開始して、位置パラメーターに展開します。展開が二重引用符内で発生すると、IFS特殊変数の最初の文字で区切られた各パラメーターの値を含む単一の単語に展開されます。つまり、"$*"
と同等です
"$1c$2c..."
。ここで、cはIFS変数の値の最初の文字です。IFSが設定されていない場合、パラメーターはスペースで区切られます。IFSがnullの場合、パラメーターはセパレーターを介さずに結合されます。
$@
-1つから開始して、位置パラメーターに展開します。展開が二重引用符で囲まれている場合、各パラメーターは個別の単語に展開されます。、されていること"$@"
と等価である"$1" "$2" ...
二重引用符で囲まれた拡張は、単語内で発生した場合、最初のパラメータの拡張は、元の単語の先頭部分と結合され、そして最後のパラメータの拡張は、元の最後の部分で接合され、語。そこには位置パラメータがない、とき
"$@"
と$@
何も展開する(すなわち、それらは削除されます)。
デモスクリプトの設定...
echo 'echo -e "\$1=$1\n\$2=$2\n\$3=$3\n\$4=$4"' > echo-params.sh
echo './echo-params.sh $*' > dollar-star.sh
echo './echo-params.sh $@' > dollar-at.sh
echo './echo-params.sh "$*"' > quoted-dollar-star.sh
echo './echo-params.sh "$@"' > quoted-dollar-at.sh
chmod +x *.sh
"$@"
-quoted-dollar-atは、引数をサブシェルに再渡すための恒等変換です(時間の約99%、これはあなたがやろうとしていたことです):
./quoted-dollar-at.sh aaa '' "'cc cc'" '"ddd ddd"'
# $1= aaa
# $2=
# $3= 'cc cc'
# $4= "ddd ddd"
"$*"
-quoted -dollar-star は、引数を1つの文字列に分割します (たとえば、条件付きで、この動作が実際に必要な時間の約1%:)if [[ -z "$*" ]]; then ...
:
./quoted-dollar-star.sh aaa '' "'cc cc'" '"ddd ddd"'
# $1= aaa 'cc cc' "ddd ddd"
# $2=
# $3=
# $4=
$*
/ $@
-引用符なしで、どちらの形式も1レベルの引用符を取り除き、基になる文字列からスペースを解釈しますが、引用符文字は無視します(ほとんどの場合、これは間違いです)。
./dollar-star.sh aaa '' "'cc cc'" '"ddd ddd"'
# $1= aaa
# $2= 'cc
# $3= cc'
# $4= "ddd
./dollar-at.sh aaa '' "'cc cc'" '"ddd ddd"'
# $1= aaa
# $2= 'cc
# $3= cc'
# $4= "ddd
楽しみたい場合は、「$ @」を使用して好きなだけネストできるので、必要に応じて要素を引数スタックからプッシュしたりポップしたりできます。
function identity() {
"$@"
}
set -x
identity identity identity identity identity echo Hello \"World\"
# + identity identity identity identity identity echo Hello '"World"'
# + identity identity identity identity echo Hello '"World"'
# + identity identity identity echo Hello '"World"'
# + identity identity echo Hello '"World"'
# + identity echo Hello '"World"'
# + echo Hello '"World"'
# Hello "World"