Bashで複数行コメントを作成する方法は?


226

私は最近、シェルスクリプトの研究を始めました。シェルスクリプトの一連の行をコメントアウトできるようにしたいと思います。C / Javaの場合のように:

/* comment1
   comment2 
   comment3
*/`

どうすればできますか?


2
次のようなハッシュを使用できます:#これはコメントです。
Mohammad Tayyab 2017

1
私は知っていますが、マルチラインでは少し面倒です。
Enes Malik Turhan 2017

2
以下の回答:では、行の最初の列(先頭のスペースなし)にある必要があることに注意してください。
2018

回答:


394

を使用: 'して開閉'します。

例えば:

: '
This is a
very neat comment
in bash
'

27
:(そしてまた非読み取り能力と潜在的なバグソースの偉大な量を追加私見が良いだけで、複数の使用である。#Sと決してこの...
jm666を

51
@ jm666 IMHO すべてのユースケースがわからないときは、決してこの単語を使用しないことをお勧めします。

19
説明する::は省略形でtrueありtrue、パラメータを処理しません。(マニュアルページ:SYNOPSIS true [ignored command line arguments]
phil294

46
間のスペース:'が重要です
becko

23
コードのブロックに対してこれを少し変更したので、コードを簡単にオンまたはオフに切り替えることができます。私の変更は# '、単一引用符の代わりに最後の行で使用することです。このようにして#、コードのブロックをアクティブにするために最初の行にシングルを置くことができます。#最初の行を削除して、コードを非アクティブ化します。
JohnMudd

131

bashの複数行コメント

: <<'END_COMMENT'
This is a heredoc (<<) redirected to a NOP command (:).
The single quotes around END_COMMENT are important,
because it disables variable resolving and command resolving
within these lines.  Without the single-quotes around END_COMMENT,
the following two $() `` commands would get executed:
$(gibberish command)
`rm -fr mydir`
comment1
comment2 
comment3
END_COMMENT

4
これは機能しますが、現在受け入れられている回答は機能しません(私にとって)。
Freek、2018年

5
これはそれ自体がコメントではないことはおそらく注目に値します。これは、複数行の文字列としてNOPコマンドにリダイレクトされるヒアドキュメントです。変数とコマンドの解決を無効にするには、一重引用符が重要です。
Nux

1
@Freekはスペースを追加する必要があります
maz 2018

これをシバン行(Debianでは#!/ bin / bash)を介して実行する単純なbashスクリプトでテストしましたが、失敗しました。私はこのページでそれぞれの答えを試していますが、以下の答えに到達するまですべて失敗しました。彼らが失敗したので、私は彼らに反対票を投じ、実際に正しく実行されているものに反対投票します。
PyTis 2018年

1
あなたの例で良いテスト。先行:は必要ありません。から始めてください<<
wisbucky

34

コメントやその他の回答に基づいてこの投稿を更新しているため、2020年5月22日より前のコメントは適用されなくなる可能性があります。

Bashは複数行コメントの組み込み構文を提供していませんが、「今すぐ機能する」既存のbash構文を使用したハックがあります。

個人的には、最も単純な(つまり、最もノイズが少なく、最も奇妙で、入力が最も簡単で、最も明示的)とは、引用されたHEREDOCを使用することですが、何をしているのかを明確にし、どこにでも同じHEREDOCマーカーを使用します。

<<'### BLOCK COMMENT'
line 1
line 2

line 3
line 4
### BLOCK COMMENT

HEREDOCマーカーを単一引用符で囲むと、クラッシュや出力の原因となる奇妙な置換、マーカー自体の解析など、一部のシェル解析の副作用を回避できます。したがって、単一引用符は、開閉コメントマーカーの自由度を高めます。たとえば、次の例では、トリプルハッシュを使用しています。これは、bashで複数行コメントを提案するようなものです。単一引用符がないと、スクリプトがクラッシュします。あなたが削除しても###FOO{}スクリプトをクラッシュ(あるいは全くあれば悪い置換が印刷されないことが原因となるset -eことは、単一引用符がなければ):

set -e

<<'### BLOCK COMMENT'
something something ${FOO{}} something
more comment
### BLOCK COMMENT

ls

もちろん、そのまま使用することもできます

set -e

<<'###'
something something ${FOO{}} something
more comment
###

ls

しかし、これの意図は、この策略に不慣れな読者には明らかにあまり明確ではありません。

現在、優れたエディタでは、ctrl- /または同様のものを押して、選択を解除/コメント化できます。誰もが間違いなくこれを理解しています:

# something something ${FOO{}} something
# more comment
# yet another line of comment

確かに、段落を再入力する場合、これは上記のブロックコメントほど便利ではありません。

確かに他のテクニックもありますが、それを行うための「従来の」方法はないようです。コメントブロックの開始と終了を示すためにbashに追加できれば###>###<非常に簡単に思えるかもしれません。


1
ああ、これは覚えやすいほど簡単/きれいです!
Thamme Gowda

1
以前の回答の注記として、逆引用符は別として、$(...)シーケンスも展開されます。これは、両方の形式がコマンド置換であるためです。
Perl Ancar、

「どちらもハックなので、将来スクリプトを壊す可能性があります。」これについて詳しく教えてください。意味的にはハックしますが、構文的には有効であり、bashが凶暴化することを決定してヒアドキュメントを破らない限り、将来は破ってはなりません。
Perl Ancar、

@perlancarハッキングが問題にまったく関係のない言語/ lib機能を使用するソリューションであることに同意した場合(コメントにヒアドキュメントを使用する、またはのような何もしないコマンドでパラメーターを使用するなどtrue)破壊のリスクはありません(ヒアドキュメントアプローチはそうですが、コロンバージョンはそうです)、1)ハッキングは意図を難読化します。および2)予想外の暗いコーナーがある(引用符を2重にする、特定のケースではヘレドックマーカーを引用するなど)。
Oliver

@Oliver:引用符で囲まれていない場合、変数は厄介な副作用を引き起こす可能性があります。ヒアドキュメントに${FOO:=bar} orのような文字列を埋め込んだとします${FOO{}}。1 FOOつ目は、変数を作成および設定する副作用がある可能性があります。2つ目は、不正な置換 エラーを発生させます。実際のコメントから期待できない両方の影響。
user1934428

24

ここで他の回答を読んだ後、私は以下を思いつきました。これは、IMHOがコメントであることを明確にします。スクリプト内の使用情報に特に適しています:

<< ////

Usage:
This script launches a spaceship to the moon. It's doing so by 
leveraging the power of the Fifth Element, AKA Leeloo.
Will only work if you're Bruce Willis or a relative of Milla Jovovich.

////

プログラマーとして、スラッシュのシーケンスはすぐに私の脳にコメントとして登録されます(通常、スラッシュは行コメントに使用されますが)。

もちろん、これ"////"は単なる文字列です。接頭辞と接尾辞のスラッシュの数は同じでなければなりません。


3
私はほとんど逃したUsage:
RNA

上記の答えに加えて。正直なところ、個別に回答するのではなく、上記の回答を編集して追加できたと思います。
PyTis 2018年

いくつかの「上」の回答があります(ソート順によって異なります)。また、個別に回答することで、選択した文字列の背後にある理由を説明したいと思いました。
noamtm 2018年

<< EOF ... EOF
l mingzhi

5

これについてあなたの意見は何ですか?

function giveitauniquename()
{
  so this is a comment
  echo "there's no need to further escape apostrophes/etc if you are commenting your code this way"
  the drawback is it will be stored in memory as a function as long as your script runs unless you explicitly unset it
  only valid-ish bash allowed inside for instance these would not work without the "pound" signs:
  1, for #((
  2, this #wouldn't work either
  function giveitadifferentuniquename()
  {
    echo nestable
  }
}

こんにちは、元の質問に対する答えではなく、質問として意図されたものではありません
Imre

よくないIMO。コメントはシェルコードとして解析可能である必要があり、かなり制限的です。
user1934428

3

これがbashで複数行コメントを行う方法です。

このメカニズムには2つの利点があります。1つは、コメントをネストできることです。もう1つは、開始行をコメント化するだけでブロックを有効にできることです。

#!/bin/bash
# : <<'####.block.A'
echo "foo {" 1>&2
fn data1
echo "foo }" 1>&2
: <<'####.block.B'
fn data2 || exit
exit 1
####.block.B
echo "can't happen" 1>&2
####.block.A

上記の例では、「B」ブロックはコメント化されていますが、「B」ブロックではない「A」ブロックの部分はコメント化されていません。

この例を実行すると、次の出力が生成されます。

foo {
./example: line 5: fn: command not found
foo }
can't happen

3

私は選択した答えを試しましたが、それを含むシェルスクリプトを実行すると、すべてが画面に出力され(jupyterノートブックが'''xx'''引用符ですべてを出力するのと同様)、最後にエラーメッセージが表示されました。何もしていませんでしたが、怖いです。その後、編集中に、単一引用符が複数の行にまたがることができることに気付きました。つまり、ブロックを変数に割り当てるだけです。

x='
echo "these lines will all become comments."
echo "just make sure you don_t use single-quotes!"

ls -l
date

'

これを変数に割り当てる必要はありません。これ、「コメント」から期待できない副作用です。をx=aに置き換える: と、同じ効果があり、副作用はありません。唯一の欠点は、コメントに単一引用符を含めてはならないことです。これが、引用されたヒアドキュメントの使用を好む理由です。これにより、コメンターは好きなように適切な終了文字列を選択できます。
user1934428

2

それほど賢くないシンプルなソリューション:

スクリプトの一部を一時的にブロックします。

if false; then
    while you respect syntax a bit, please
    do write here (almost) whatever you want.
    but when you are
    done # write
fi

少し洗練されたバージョン:

time_of_debug=false # Let's set this variable at the beginning of a script

if $time_of_debug; then # in a middle of the script  
    echo I keep this code aside until there is the time of debug!
fi

-2

#私は怠惰とシンプルさが好きです。私は面白い回避策で#を使用します:

1押す:]検索ctrl + Fまたはcmd + Fまたは何か[検索機能をトリガーする

2次のように、検索フィールドで正規表現を使用します。 (^.+)

3置換:# $1または、必要に応じて#$1


#注:エディターに3つのステップがない場合があります。その場合は、オンライン正規表現ツールを使用してください(ポリシー上の理由から、ここでは提案できません)。

  1. どこにいてもテキストを選択してコピーし、オンラインの正規表現ツールに貼り付けます
  2. (^.+)正規表現として、#$1または#\1置換パターンとして使用する
  3. テキストを選択してコピーし、最初に貼り付けます

#ハッシュをお楽しみください!


最近の多くの編集者は、ctrl+/複数行の場合でも、コメントのオンとオフを切り替えるホットキーを持っています。また、使用している言語に基づいてコメント文字を変更することもできます。
ninMonkey
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.