パラメータ拡張時:
二重引用符を使用したパラメータ拡張は、二重引用符がないよりも常に良いですか(または悪いですか?)二重引用符が推奨されない状況はありますか?
パラメータ名の周囲に中かっこをいつ追加する必要がありますか?
パラメータ名の周りに中括弧の代わりにパラメータ拡張の周囲に二重引用符を使用する必要がある場合はいつですか?その反対はいつ頃でしょうか?どちらかはいつ動作しますか?
ありがとうございます。
答え1
引用する
拡張値を維持したい場合は、参照パラメータ拡張が常に優れています。いいえ単語に分割してIFS値の影響を受けます。たとえば、
$ IFS=" elr"
$ var="Hello World"
$ printf '<%s> ' $var; echo
<H> <> <> <o> <Wo> <> <d>
$ printf '<%s> ' "$var"; echo
<Hello World>
しかし、実際には、分割を完了するために引用されていない拡張が必要な非常に制限的なケースがあります。
$ IFS=$' \t\n'
$ var="one two three"
$ array=($var)
$ declare -p array
declare -a array=([0]="one" [1]="two" [2]="three")
このトピックへのリンク:
いつ二重引用符が必要ですか?
ザイルズ
スティーブン・チャジェラス
パンツサスペンダー
変数名の後の文字をその変数名に関連付けてはいけない場合は、常に中括弧が必要です。
$ var=one
$ echo "The value of var is $varvalue"
The value of var is
$ echo "The value of var is ${var}value"
The value of var is onevalue
~からLESS="+/which is not to be interpreted as part" man bash
${parameter}
パラメーターの後に名前の一部として解釈されない文字が続く場合は、中括弧が必要です。
また、2桁の位置引数を処理するときは中括弧が必要です。
$ set -- one two t33 f44 f55 s66 s77 e88 n99 t10 e11 t12
$ echo "$11 ${11} $12 ${12}"
one1 e11 one2 t12
マニュアルを読む:LESS="+/enclosed in braces" man bash
複数の数値で構成される位置引数を拡張する場合は、中かっこで囲む必要があります。
またはLESS="+/with more than one digit" man bash
$ {parameter}
パラメーターの値が置き換えられます。引数が2桁以上の位置引数の場合は、中括弧が必要です。
引用符と中括弧
パラメータ名の周りに中括弧の代わりにパラメータ拡張の周囲に二重引用符を使用する必要がある場合はいつですか?その反対はいつ頃でしょうか?どちらかはいつ動作しますか?
「しなければならない」というルールはなく、次のいずれかを使用する可能性が開いています。
$ var=One
$ echo "ThisIs${var}Var"
ThisIsOneVar
$ echo "ThisIs""$var""Var"
ThisIsOneVar
$ echo 'ThisIs'"$var"'Var'
ThisIsOneVar
$ echo 'ThisIs'"${var}"'Var'
ThisIsOneVar
すべての拡張は全く同じですので、必要なものを使用してください。
答え2
中かっこが必要な状況の1つは、変数を文字列の一部として使用したい場合です。
$ var=test
$ echo "stuff$varmorestuff"
stuff
$ echo "stuff${var}morestuff"
stufftestmorestuff
中かっこがない場合、シェルは私がwhichという名前の未設定の変数を拡張しようとしていると思いますvarmorestuff
。
Bashリファレンスマニュアルから3.5.3 シェルパラメータの拡張:
'$'文字は、パラメータ拡張、コマンド置換、または算術拡張を導入します。拡張するパラメータ名または記号は中括弧で囲むことができます。これはオプションですが、名前の一部として解釈できる直後の文字から拡張される変数を保護するために使用されます。
シェルマニュアルから2.6.2 パラメータ拡張
パラメータ名またはシンボルが中括弧で囲まれていない場合、拡張はその名前で表されるシンボルの有無にかかわらず最も長い有効な名前を使用する必要があります(IEEE Std 1003.1-2001のデフォルト定義ボリューム、セクション3.230、名前を参照)。 。
また、2桁の位置引数を処理するときは中括弧が必要です。
スクリプトファイル
#!/bin/sh
if [ "$1" = 'correct' ]; then
echo "$2" "$3" "$4" "$5" "$6" "$7" "$8" "$9" "${10}"
else
echo "$2" "$3" "$4" "$5" "$6" "$7" "$9" "$9" "$10"
fi
実行中:
$ ./script.sh one two three four five six seven eight nine ten
two three four five six seven nine nine one0
$ ./script.sh correct two three four five six seven eight nine ten
two three four five six seven eight nine ten
バッシュマニュアルから3.4.1 位置パラメータ
位置パラメータNは、$ {N}として引用するか、Nが単一の数字で構成されている場合は$ Nとして引用することができます。
シェルマニュアル2.6.2パラメータ拡張からの抜粋
パラメータ名または記号は中括弧で囲むことができます。ただし、2桁以上の位置引数がある場合、または引数の後に名前の一部として解釈できる文字がある場合は、中括弧はオプションです。一致する閉じ括弧は、中括弧レベルの計算、引用符の文字列のスキップ、およびコマンドの置き換えによって決定する必要があります。