私は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