1. ホーム
  2. bash

[解決済み] Bashシェルで${var}、"$var"、"${var}"の違いは何ですか?

2022-04-23 21:03:48

質問

タイトルの意味:変数をカプセル化し {} , "" または "{} "ですか?これについては、ネットで調べても説明がないんですよねー、記号を使う以外参考にならないし、何も出てこないし。

以下はその例です。

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

最初のものだけが、私が欲しいもの、つまり配列の各要素を繰り返し処理することを達成しています。の違いはよくわかりません。 $groups , "$groups" , ${groups}"${groups}" . どなたか解説していただけるとありがたいです。

追加の質問ですが、これらのカプセル化を参照するための一般的な方法をご存知の方はいらっしゃいますか?

どのように解決するのですか?

中括弧( $var vs. ${var} )

ほとんどの場合 $var${var} は同じです。

var=foo
echo $var
# foo
echo ${var}
# foo

中括弧は、式のあいまいさを解消するためにのみ必要です。

var=foo
echo $varbar
# Prints nothing because there is no variable 'varbar'
echo ${var}bar
# foobar

引用元 ( $var vs. "$var" vs. "${var}" )

変数の周りに二重引用符を付けると、たとえ空白文字が含まれていても、それを1つの単語として扱うようにシェルに指示します。

var="foo bar"
for i in "$var"; do # Expands to 'for i in "foo bar"; do...'
    echo $i         #   so only runs the loop once
done
# foo bar

その動作を次のように対比させる。

var="foo bar"
for i in $var; do # Expands to 'for i in foo bar; do...'
    echo $i       #   so runs the loop twice, once for each argument
done
# foo
# bar

と同様に $var vs. ${var} のように、中括弧は曖昧さ回避のためにのみ必要です。

var="foo bar"
for i in "$varbar"; do # Expands to 'for i in ""; do...' since there is no
    echo $i            #   variable named 'varbar', so loop runs once and
done                   #   prints nothing (actually "")

var="foo bar"
for i in "${var}bar"; do # Expands to 'for i in "foo barbar"; do...'
    echo $i              #   so runs the loop once
done
# foo barbar

なお "${var}bar" は、次のように書くこともできます。 "${var}"bar この場合、中括弧は不要になります。 "$var"bar . しかし、文字列の中に引用符がたくさんある場合、これらの代替形式は読みづらくなります(したがって、メンテナンスも難しくなります)。 このページ は、Bashにおけるクオートの良い入門書です。

配列( $var vs. $var[@] vs. ${var[@]} )

さて、次は配列です。によると バッシュマニュアル :

添え字のない配列変数を参照することは、添え字が 0 の配列を参照することと同じです。

つまり、インデックスを指定せずに [] の場合、配列の最初の要素が取得されます。

foo=(a b c)
echo $foo
# a

と全く同じです。

foo=(a b c)
echo ${foo}
# a

配列の全要素を取得するためには @ をインデックスとして、例えば ${foo[@]} . 中括弧は配列で必要です。 $foo の部分が最初に表示され、配列の最初の要素に続いてリテラルな [@] :

foo=(a b c)
echo ${foo[@]}
# a b c
echo $foo[@]
# a[@]

このページ は、Bashでの配列の良い入門書です。

引用符再訪 ( ${foo[@]} vs. "${foo[@]}" )

この点については質問されませんでしたが、微妙な違いなので知っておくとよいでしょう。配列の要素に空白が含まれる可能性がある場合は、ダブルクォートを使用して各要素を個別の "word:" として扱わせる必要があります。

foo=("the first" "the second")
for i in "${foo[@]}"; do # Expands to 'for i in "the first" "the second"; do...'
    echo $i              #   so the loop runs twice
done
# the first
# the second

二重引用符を使わない場合の動作と対比してください。

foo=("the first" "the second")
for i in ${foo[@]}; do # Expands to 'for i in the first the second; do...'
    echo $i            #   so the loop runs four times!
done
# the
# first
# the
# second