変数の括り方
変数の書き方として、以下のようなものがある。どうして括りが必要か? $var
${var}
"$var"
${var} とする理由
どこが変数名の終端なのか区別が付かないことがある。
{}がない場合は、先頭が英字または数字、その後英字と数字とアンダースコアの並びで最長のものが変数名とされる。
正規表現で書くと [A-Za-z_][A-Za-z0-9_]*
このため、そういう文字が続かないのであれば{}を付けなくても良い。
例えば、${foo}_barならば、fooまでにする必要があるので{}が必要となる。
"$var"とする理由
ダブルクォーテーションで括られた内側はフィールド分割で分割されないようになる。
変数内で空白がいくつか入っていても、一つのフィールドとみなされる。
実際の所どうなのか
フィールド分割させたくない場合
"$var"だけで十分。
ダブルクォーテーションの範囲を広げたいなら "... ${var} ..." を使う。
ダブルクォーテーションは繰り返してもよい。例えば "$a "" $b" とすると、空白を含めて結合した状態で展開される。
英数字とアンダースコアが続かないのであれば、"... $var ..." でよい。
フィールド分割させたい場合
${var}にする必要がある。
英数字とアンダースコアが続かないのであれば、$var でよい。
code:arg.sh
i=1
for a in "$@"
do
printf "%s:\"%s\"\n" $i "$a"
i=$((i+1))
done
code:console
$ ./args.sh a b
1:"a"
2:"b"
$ X="a b"
$ Y=" c d "
$ ./args.sh $X
1:"a"
2:"b"
$ ./args.sh ${X}
1:"a"
2:"b"
$ ./args.sh "$X"
1:"a b"
$ ./args.sh ${X}${Y}
1:"a"
2:"b"
3:"c"
4:"d"
$ ./args.sh "$X""$Y"
1:"a b c d "