11
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ヒアドキュメントのパラメータ展開を個別に制御する(及びそれに関してハマったところ)

Last updated at Posted at 2016-06-09

ヒアドキュメントでパラメータ展開(変数等の展開)をさせないためにはテキスト終端記号を'"\を使ってクォートすればよいが、パラメータ毎に展開するか否か制御したい場合がある。

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
\
11
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?