シェルスクリプトでの複数行コメントアウトについては、
多くの方が紹介されているように、ヒアドキュメントを使用した方法がある。
指定方法について、いくつかの方法があるが、
うまくコメントアウトできないケースなどで、はまったことがあったので、自分なりに整理した。
引用元
本記事は、特に以下の記事を参考にさせて頂いた。
bashで複数行コメントアウトする方法 - Qiita
bashの変数内文字列置換まとめ - Qiita
コメントアウト実例
共通するのはヒアドキュメントを使用することだが、いくつかのバリエーションがある。
以下に4つ示す。
1. : コマンド(NULLコマンド)へヒアドキュメント指定(標準入力)を渡す
: コマンドにヒアドキュメント指定で渡す
: << COMMENT
echo "Comment Out 1"
echo "Comment Out 2"
echo "Comment Out 3"
COMMENT
: はNULLコマンドと呼ばれ、何もしない。
< COMMENT はヒアドキュメント指定
よって、NULLコマンドにヒアドキュメント指定(標準入力)を渡すことで、何もしないという結果になる。
2. : コマンド指定無し
実は、: は無くても、コメントアウト可能
標準入力されたものは、捨てられる?
<< COMMENT
echo "Comment Out 1"
echo "Comment Out 2"
echo "Comment Out 3"
COMMENT
ただ、上記の1. 2.の方法では、コメントアウトしたい部分に、以下のような文字列が含まれる場合、エラーになる。
<< COMMENT
echo "Comment Out 1"
echo "Comment Out 2"
echo "Comment Out 3"
# ${変数%マッチパターン} マッチパターンが除去される
HOGE="/var/log/httpd/access.log"
echo ${HOGE%/*} #=> /var/log/httpd
COMMENT
エラー内容
: bad substitution
原因としては、
${変数%マッチパターン} の部分について、標準入力する際に、変数展開されてしまうことによる。
そこで、以下のような方法がある
3. ヒアドキュメントのデリミタを引用符で囲む
デリミタを引用符で囲むと、ヒアドキュメント内のコマンドが評価されなくなる。
結果、変数展開などがされず、エラーにはならない。
<< "COMMENT"
echo "Comment Out 1"
echo "Comment Out 2"
echo "Comment Out 3"
# ${変数%マッチパターン} マッチパターンが除去される
HOGE="/var/log/httpd/access.log"
echo ${HOGE%/*} #=> /var/log/httpd
COMMENT
4. ヒアドキュメントのデリミタを引用符で囲んだ上で、デリミタに#を付ける
更に、デリミタに#を付けると、ヒアドキュメントでコメントアウトした部分を有効化したい時に役立つ。
コメントアウトした状態は以下
<< "#COMMENT"
echo "Comment Out 1"
echo "Comment Out 2"
echo "Comment Out 3"
# ${変数%マッチパターン} マッチパターンが除去される
HOGE="/var/log/httpd/access.log"
echo ${HOGE%/*} #=> /var/log/httpd
#COMMENT
以下のようにすれば、コメントアウトを無効化、つまり、コードを有効化できる。
#<< "#COMMENT"
echo "Comment Out 1"
echo "Comment Out 2"
echo "Comment Out 3"
# ${変数%マッチパターン} マッチパターンが除去される
HOGE="/var/log/httpd/access.log"
echo ${HOGE%/*} #=> /var/log/httpd
#COMMENT
まとめ
とにかくコメントアウトしたい場合は、
4 の「ヒアドキュメントのデリミタを引用符で囲んだ上で、デリミタに#を付ける」が一番良い気がする。