遊んでいたらはまったので備忘録を兼ねて記述。
変数名が被っていてかつ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} }"