173

{}タイトルの意味: 、""、または"で変数をカプセル化することはどういう意味"{}ですか? これについてオンラインで説明を見つけることができませんでした。記号を使用する以外は、それらを参照できませんでした。何ももたらさない。

次に例を示します。

declare -a groups

groups+=("CN=exampleexample,OU=exampleexample,OU=exampleexample,DC=example,DC=com")
groups+=("CN=example example,OU=example example,OU=example example,DC=example,DC=com")

これ:

for group in "${groups[@]}"; do
    echo $group
done

これとは大きく異なることがわかります:

for group in $groups; do
    echo $group
done

この:

for group in ${groups}; do
    echo $group
done

最初の 1 つだけが、配列内の各要素を反復処理するという目的を達成します。$groups"$groups"${groups}およびの違いについてはよくわかりません"${groups}"。誰かがそれを説明できれば、私はそれを感謝します。

追加の質問として、これらのカプセル化を参照する受け入れられた方法を知っている人はいますか?

4

6 に答える 6

11

TL;DR

あなたが与えるすべての例は、 Bash Shell Expansionsのバリエーションです。展開は特定の順序で行われ、特定のユース ケースがあるものもあります。

トークン区切り記号としての中括弧

この${var}構文は主に、あいまいなトークンを区切るために使用されます。たとえば、次のことを考慮してください。

$ var1=foo; var2=bar; var12=12
$ echo $var12
12
$ echo ${var1}2
foo2

配列展開におけるブレース

中かっこは、配列の要素にアクセスしたり、その他の特別な展開を行うために必要です。例えば:

$ foo=(1 2 3)

# Returns first element only.
$ echo $foo
1

# Returns all array elements.
$ echo ${foo[*]}
1 2 3

# Returns number of elements in array.
$ echo ${#foo[*]}
3

トークン化

残りの質問のほとんどは、引用と、シェルが入力をトークン化する方法に関係しています。次の例で、シェルが単語分割を実行する方法の違いを検討してください。

$ var1=foo; var2=bar; count_params () { echo $#; }

# Variables are interpolated into a single string.
$ count_params "$var1 $var2"
1

# Each variable is quoted separately, created two arguments.
$ count_params "$var1" "$var2"
2

シンボルは@、 とは異なる方法で引用と相互作用し*ます。具体的には:

  1. $@「[e] は、1 から始まる位置パラメーターに展開されます。展開が二重引用符内で発生すると、各パラメーターは個別の単語に展開されます。」
  2. 配列では、「単語が二重引用符で囲まれ${name[*]}ている場合、各配列メンバーの値が IFS 変数の最初の文字で区切られた単一の単語に展開され、${name[@]}name の各要素が個別の単語に展開されます。」

これは、次のように実際に確認できます。

$ count_params () { echo $#; }
$ set -- foo bar baz 

$ count_params "$@"
3

$ count_params "$*"
1

シェルが意図したとおりに単語を分割するのを妨げる可能性のあるスペースまたは特殊文字を含む値を変数が参照する場合、引用符付き展開の使用は非常に重要です。Bash での引用の仕組みの詳細については、引用を参照してください。

于 2013-08-08T21:53:23.340 に答える