ヒアドキュメントでパラメータ展開(変数等の展開)をさせないためにはテキスト終端記号を'
、"
、\
を使ってクォートすればよいが、パラメータ毎に展開するか否か制御したい場合がある。
argcheck_bad.sh
cat <<EOF
$0=$0
$1=$1
$2=$2
EOF
$ ./argcheck_bad.sh 12 34
./argcheck_bad.sh=./argcheck_bad.sh
12=12
34=34
この場合は展開したくないパラメータの$
記号を\
でエスケープしてやればよい。
argcheck.sh
cat <<EOF
\$0=$0
\$1=$1
\$2=$2
EOF
$ ./argcheck.sh 12 34
$0=./argcheck.sh
$1=12
$2=34
以下自分がハマったところ
ところでヒアドキュメントの内容を変数に格納したい時はコマンド置換を使って次のように書ける。
argcheck2.sh
result=`cat <<EOF
\\$0=$0
\\$1=$1
\\$2=$2
EOF`
echo "$result"
$ ./argcheck2.sh 12 34
$0=./argcheck2.sh
$1=12
$2=34
ここで二重のバックスラッシュ\\
を使っている点に注意。バッククォートを使ったコマンド置換では、原則的にはバックスラッシュ\
はそのまま解釈されるが、$
、`
、\
の前にある場合は例外となるためこのようにしている。
escape.sh
result=`cat <<EOF
\ttab
\\\\
EOF`
echo -e "$result" # -eはechoにエスケープを解釈させるのに必要
$ ./escape.sh
tab
\