シェルスクリプトにおける変数のクォート

遊んでいたらはまったので備忘録を兼ねて記述。
変数名が被っていてかつnestして呼んでいると、どのスコープの変数なのか分からなくなる
ことがあったり。

その1

シェルスクリプト内部で設定した変数をawkに食わせて判定したいとき。
内外でダブルクォートして文字列として扱わせないと
変数に(やらスペースが入っていたときにsyntax errorになる。

VAL="1 (a) {b} c"
#NG
cat hoge | awk "{ if($0 == ${VAL}){print $1} }"
#NG
cat hoge | awk '{ if($0 == '${VAL}'){print $1} }'
#OK
cat hoge | awk '{ if($0 == "'"${VAL}"'"){print $1} }'

その2

どちらも同じ結果だけど、後者の$1はawk側ではなくsh側の変数で展開されている。
当然ながら前者の方が正しい使い方。

ENV="xxx"
#OK
echo "xxx XXX" | awk '{if(/^'${ENV}'/){print $0} }'
#BAD
echo "xxx XXX" | awk "{if(/^${ENV}/){print $1} }"