複数行のシェルスクリプトコメント-これはどのように機能しますか?

最近、これまでに見たことのない複数行のコメントタイプに出くわしました。スクリプトの例を次に示します。

echo a # : aaa : ddd # echo b 

これは、vim構文でも機能するようです-強調表示されます。このスタイルのコメントとは何と呼ばれ、それに関する詳細情報を見つける方法は?

コメント

  • 代わりにコードを関数にラップするとどうなりますか?コメントアウトしますか? CommentedOutBlock() { echo "test"; }
  • 他の人がすでに述べたように、複数行コメントはネイティブでは利用できません。したがって、falseの場合は使用します。次に、<必要な行数> fi

回答

これは複数行コメントではありません。 #は1行のコメントです。 :(コロン)はコメントではなく、基本的にはシェルの組み込みコマンドです。 NOP trueのようにtrueを返す以外に何もしないnull操作(したがって、を0に設定)。ただし、コマンドであるため引数を受け入れることができ、引数を無視するため、ほとんどの場合、表面的にはコメントのように機能します。この応急修理の主な問題は、議論がまだ拡大されており、意図しない結果が多数発生することです。引数は引き続き構文エラーの影響を受け、リダイレクトは引き続き実行されるため、: > filefileを切り捨て、: $(dangerous command)置換は引き続き実行されます。

シェルスクリプトにコメントを挿入するための最も驚くべき完全に安全な方法は、#を使用することです。複数行のコメントであっても、それに固執します。コメントに:を(乱用)使用しようとしないでください。 Cのような言語のスラッシュスター/* */形式に類似した、シェル内の専用の複数行コメントメカニズムはありません。


完全を期すためですが、推奨される方法ではありませんが、ヒアドキュメント複数行の「コメント」を行うには:

: <<"end_long_comment" This is an abuse of the null command ":" and the here-document syntax to achieve a "multi-line comment". According to the POSIX spec linked above, if any character in the delimiter word ("end_long_comment" in this case) above is quoted, the here-document will not be expanded in any way. This is **critical**, as failing to quote the "end_long_comment" will result in the problems with unintended expansions described above. All of this text in this here-doc goes to the standard input of :, which does nothing with it, hence the effect is like a comment. There is very little point to doing this besides throwing people off. Just use "#". end_long_comment 

コメント

  • +1は非常に重要です<<行に一重引用符を付けてください。これにより置換と展開がオフになります。
  • さらに、シェルスクリプトにiv id =を入力します。コメントである必要があるものについては「d454996274」

を使用すると、RAM / CPUが余分に消費されます。 'デスクトップ上の単純なものには対応しませんが、'の場合、1秒間に数百回または数千回実行されます' div id = “188d9523f6″>

ll 何もしない、非常に高速

  • @bahamat:何百もの何かを実行した場合または、1秒間に数千回、'シェルで記述しないことを願っています… = /
  • 場合によっては、複数行のnullユーティリティを使用します。テキストが役立つ場合があります。コメントを: <<=cutで始めると、シェルスクリプトでPODを記述できます。詳細についてはこの例を参照してください。これにより、perldoc script.shを使用できるようになります。ただし、この回答に示されている複数行のコメントは、間違いなくコメントブロックである必要があります(各行は# で始まります)。
  • ここ'ヒアドキュメントに関する素晴らしいディスカッション。コメントとその他の興味深いユースケース(dynaimcスクリプトの生成を含む)の両方に使用されます: tldp.org/LDP/ abs / html / here-docs.html#EX71C
  • 回答

    そうではありませんあらゆるスタイルのコメント。:組み込みコマンドはまったく何もしません。ここでコメントするために悪用されています。

    $ help : :: : Null command. No effect; the command does nothing. Exit Status: Always succeeds. 

    回答

    初期のシェルでは、コメントを作成する唯一の方法はコロンでした。

    ただし、そうではありません。行は他のコマンドが解析されるのとまったく同じ方法で解析されるため、真のコメントであり、副作用が生じる可能性があります。例:

    : ${a:=x} # assigns the value "x" to the variable, "a" : $(command) # executes "command" 

    (コロンは、これらの副作用を呼び出す目的でのみ使用される場合がありますが、コメントとしては使用されません。)

    スクリプトのセクションをコメントアウトするためにコロンを使用すると便利な場合があります:

    : " while [ "$n" -ne "$x" ] do : whatever done " 

    これは、それぞれの前に置くよりも大幅に時間を節約できます。 #の行、特にコメントアウトが一時的なものである場合。

    コメント

    • その単一-引用符コメントメソッドは、'それ自体が単一引用符を使用するスクリプトのどのセクションでも機能しません。また、必要な範囲で引用符を使用している場合は、'スクリプト全体に正当な一重引用符が散在していることを意味します。行ごとのコメントをブロックできる適切なエディターを使用する方がはるかに簡単です。
    • 引用符で囲まれたセクションに一重引用符がない場合にのみ機能するのは、まったく正しいことです。ただし、スクリプトに多くの一重引用符を含める必要はありません。私のスクリプトのいくつかを見ると、それらは比較的まばらであり、多くは二重引用符で置き換えることができます。
    • 一重引用符または二重引用符の選択は、些細で無関係なものの影響をほとんど受けないはずです。スクリプトのテキスト自体が有効な一重引用符で囲まれた文字列であるかどうかを懸念します。一重引用符は拡張を防ぐために使用されますが、二重引用符は特定の拡張を許可し、追加の解析を必要とします。これは、どちらを使用するかを決定するための実際の基準です。
    • これは、これを行う最もシックな方法です。ドキュメントの小さなブロックに最適です。 /* */よりも気に入っています。' <!-- -->を使い始めないでください。 !

    回答

    コメントがスクリプトの最後にある場合は、次のように実行できます。

    #!/bin/sh echo "hello world" exec true we can put whatever we want here \"\"\$\`!#%&()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_ abcdefghijklmnopqrstuvwxyz{|}~ 

    コメントを残す

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です