[解決済み] Bashシェルで${var}、"$var"、"${var}"の違いは何ですか?
質問
タイトルの意味:変数をカプセル化し
{}
,
""
または
"{}
"ですか?これについては、ネットで調べても説明がないんですよねー、記号を使う以外参考にならないし、何も出てこないし。
以下はその例です。
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
関連
-
[解決済み] "[0: コマンドが見つかりません]" in Bash [重複].
-
[解決済み] JavaScriptで "use strict "は何をするのか、その根拠は?
-
[解決済み] Bashスクリプトのソースディレクトリをスクリプト自体から取得するにはどうすればよいですか?
-
[解決済み] Bashシェルスクリプトでディレクトリが存在するかどうかを確認するにはどうすればよいですか?
-
[解決済み] パラメータに**(ダブルスター/アスタリスク)、*(スター/アスタリスク)がありますが、これはどういう意味ですか?
-
[解決済み] シェルで、「2>&1」はどういう意味ですか?
-
[解決済み] Bashでコマンドの出力に変数を設定するにはどうすればよいですか?
-
[解決済み] Bashシェルスクリプトの入力引数の存在確認
-
[解決済み] Bashのシングルクォートとダブルクォートの違い
-
[解決済み】Bashでファイル名と拡張子を抽出する。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Bashのif条件で「unary operator expected」エラーが発生する。
-
[解決済み] bashスクリプトでタブ文字をエコーする
-
[解決済み] bashの文字列の等値性テストで、予期しない演算子エラーが発生するのはなぜですか?重複
-
[解決済み] Bashスクリプトで引数を反復処理する方法
-
[解決済み] ssh / リモートbashコマンドでシングルクォート文字をエスケープするにはどうすればよいですか?
-
[解決済み] bashでjsonファイルを解析するためにjqの出力からダブルクオートを削除する方法は?
-
[解決済み] プロジェクトからすべての .pyc ファイルを削除するにはどうすればよいですか?
-
[解決済み] condaのアップデート後、ターミナルのプロンプトから(base)を削除する方法
-
[解決済み] "[0: コマンドが見つかりません]" in Bash [重複].
-
[解決済み】シェル変数に引用符で囲むのはいつ?