私は最近、シェルスクリプトの研究を始めました。シェルスクリプトの一連の行をコメントアウトできるようにしたいと思います。C / Javaの場合のように:
/* comment1
comment2
comment3
*/`
どうすればできますか?
:
では、行の最初の列(先頭のスペースなし)にある必要があることに注意してください。
私は最近、シェルスクリプトの研究を始めました。シェルスクリプトの一連の行をコメントアウトできるようにしたいと思います。C / Javaの場合のように:
/* comment1
comment2
comment3
*/`
どうすればできますか?
:
では、行の最初の列(先頭のスペースなし)にある必要があることに注意してください。
回答:
を使用: '
して開閉'
します。
例えば:
: '
This is a
very neat comment
in bash
'
#
Sと決してこの...
:
は省略形でtrue
ありtrue
、パラメータを処理しません。(マニュアルページ:SYNOPSIS true [ignored command line arguments]
:
と'
が重要です
# '
、単一引用符の代わりに最後の行で使用することです。このようにして#
、コードのブロックをアクティブにするために最初の行にシングルを置くことができます。#
最初の行を削除して、コードを非アクティブ化します。
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
:
は必要ありません。から始めてください<<
。
コメントやその他の回答に基づいてこの投稿を更新しているため、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に追加できれば###>
、###<
非常に簡単に思えるかもしれません。
true
)破壊のリスクはありません(ヒアドキュメントアプローチはそうですが、コロンバージョンはそうです)、1)ハッキングは意図を難読化します。および2)予想外の暗いコーナーがある(引用符を2重にする、特定のケースではヘレドックマーカーを引用するなど)。
${FOO:=bar}
orのような文字列を埋め込んだとします${FOO{}}
。1 FOO
つ目は、変数を作成および設定する副作用がある可能性があります。2つ目は、不正な置換 エラーを発生させます。実際のコメントから期待できない両方の影響。
ここで他の回答を読んだ後、私は以下を思いつきました。これは、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.
////
プログラマーとして、スラッシュのシーケンスはすぐに私の脳にコメントとして登録されます(通常、スラッシュは行コメントに使用されますが)。
もちろん、これ"////"
は単なる文字列です。接頭辞と接尾辞のスラッシュの数は同じでなければなりません。
Usage:
<< EOF ... EOF
これについてあなたの意見は何ですか?
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
}
}
これが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
私は選択した答えを試しましたが、それを含むシェルスクリプトを実行すると、すべてが画面に出力され(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に置き換える:
と、同じ効果があり、副作用はありません。唯一の欠点は、コメントに単一引用符を含めてはならないことです。これが、引用されたヒアドキュメントの使用を好む理由です。これにより、コメンターは好きなように適切な終了文字列を選択できます。
それほど賢くないシンプルなソリューション:
スクリプトの一部を一時的にブロックします。
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
#私は怠惰とシンプルさが好きです。私は面白い回避策で#を使用します:
1押す:]検索ctrl + Fまたはcmd + Fまたは何か[検索機能をトリガーする
2次のように、検索フィールドで正規表現を使用します。 (^.+)
3置換:# $1
または、必要に応じて#$1
#注:エディターに3つのステップがない場合があります。その場合は、オンライン正規表現ツールを使用してください(ポリシー上の理由から、ここでは提案できません)。
(^.+)
正規表現として、#$1
または#\1
置換パターンとして使用する#ハッシュをお楽しみください!
ctrl+/
複数行の場合でも、コメントのオンとオフを切り替えるホットキーを持っています。また、使用している言語に基づいてコメント文字を変更することもできます。