bashには特別な変数に対する他の弱い参照規則がありますか?

bashには特別な変数に対する他の弱い参照規則がありますか?

私はbashの引用のニュアンスを完全に理解していないようです。

foo.sh番号付きパラメータのみを出力するスクリプトがあります。

#!/bin/bash

i=1
while [ $i -le $# ] ; do
    v=$(eval "echo \$$i")
    echo "$i: $v"
    i=$((i + 1))
done

次のように使用できます。

me@localhost] ./foo.sh a b c
1: a
2: b
3: c

args変数をスペースを含む値(たとえば)に設定すると、"super nintendo"次のようになります。引用しないBashにこれを2つの引数として扱うようにします。

me@localhost] args="super nintendo" ; ./foo.sh $args
1: super
2: nintendo

または私は使用することができます弱い参照(二重引用符)はbashにそれを単一の引数として扱うように指示しますが、変数を実際の値に拡張します。

me@localhost] args="super nintendo" ; ./foo.sh "$args"
1: super nintendo

または私は使用することができます強力な参照(一重引用符)文字通り処理します。

me@localhost] args="super nintendo" ; ./foo.sh '$args'
1: $args

ただし、特殊変数への弱い参照は、$@参照がまったくないようです。たとえば、bar.sh以下はfoo.sh弱い参照を使用して一度、参照なしで一度、合計2回呼び出されます。

#!/bin/bash

./foo.sh "$@"
./foo.sh $@

このコマンドを呼び出すと、両方の呼び出し./bar.sh a b cに対して同じ出力が生成されますfoo.sh

1: a
2: b
3: c
1: a
2: b
3: c

私は何ですか?予想されるあなたが見るものは次のとおりです。

1: a b c
1: a
2: b
3: c

Bashで引用するとき、私は何を見逃していますか?

答え1

$@これは配列であり、配列参照に異なる規則があるためです。

  • "${array[@]}"または"$@"配列のメンバーに拡張
  • "${array[*]}"または、"$*"変数の最初の文字で連結された配列要素に展開されます$IFS

複数のパラメータを試してください。その一部にはスペースが含まれています。

./foo.sh 'one two' three

関連情報