3
5

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.

シェルスクリプトの複数行コメントアウト

Posted at

シェルスクリプトでの複数行コメントアウトについては、
多くの方が紹介されているように、ヒアドキュメントを使用した方法がある。

指定方法について、いくつかの方法があるが、
うまくコメントアウトできないケースなどで、はまったことがあったので、自分なりに整理した。

引用元

本記事は、特に以下の記事を参考にさせて頂いた。
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 の「ヒアドキュメントのデリミタを引用符で囲んだ上で、デリミタに#を付ける」が一番良い気がする。

3
5
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
3
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?