Blockieren Sie Kommentare in einem Shell-Skript

250

Gibt es eine einfache Möglichkeit, einen Codeblock in einem Shell-Skript zu kommentieren?

sie rufen mich an
quelle
2
Interessant, wie diese einfache und zu einfache Frage zu unterschiedliche und komplizierte Antworten hat.
Sigur

Antworten:

348

In Bash:

#!/bin/bash
echo before comment
: <<'END'
bla bla
blurfl
END
echo after comment

Das 'und 'um das ENDTrennzeichen sind wichtig, andernfalls werden Dinge innerhalb des Blocks, wie zum Beispiel $(command), analysiert und ausgeführt.

Eine Erklärung finden Sie in dieser und dieser Frage.

sunny256
quelle
24
Süßer Trick - solange das Schlüsselwort 'END' (das natürlich vom Benutzer ausgewählt wird) nicht in einer eigenen Zeile innerhalb des zu kommentierenden Materials erscheint.
Jonathan Leffler
9
@kalengi: Ja; Das in den Anführungszeichen verwendete Wort kann alles Bequeme sein. EOFist ein klassisches Beispiel (und so ist !, ein Ausrufezeichen auf eigenem), aber man konnte verwenden SNURFLE_BURGERSoder classical_end_markeroder im kommentierten-out anderen Wort , das auf seinem eigenen nicht Material auf eine Linie erscheinen. Ich würde nicht gerne mit Räumen usw. experimentieren, aber das Wort könnte auch mit ihnen funktionieren.
Jonathan Leffler
4
Es funktioniert definitiv, aber kann jemand näher erläutern, wie dies funktioniert? Danke
mbbce
5
@MB_CE, siehe stackoverflow.com/questions/32126653/… . Das heißt - es wird ein Befehl ( :) ausgeführt, der seine Eingabe nicht liest und immer mit einem erfolgreichen Wert beendet wird, und der "Kommentar" wird als Eingabe gesendet. Nicht viel dazu.
Charles Duffy
2
Ich finde es unglaublich hässlich und verwirrend, aktiven Code zu schreiben, um passiven Code zu erstellen ... benutze einfach den guten alten Blockauswahlmodus und drücke #; Was ist das große Problem dabei?
Rusty75
90

Es gibt keinen Blockkommentar zum Shell-Skript.

Mit vi(Ja vi) können Sie leicht von Zeile n bis m kommentieren

<ESC>
:10,100s/^/#/

(das heißt, von Zeile 10 bis 100 ersetzen Sie den Zeilenanfang (^) mit einem # -Zeichen.)

und un Kommentar mit

<ESC>
:10,100s/^#//

(das heißt, von Zeile 10 bis 100 Ersatzzeilenstart (^) gefolgt von # mit der Angabe //.)

viist fast universell, wo immer es gibt /bin/sh.

OscarRyz
quelle
Netter Trick mit regulärem Ausdruck auf vi, um # vor Zeilen zu setzen.
Atiq Rahman
5
Nur ein Tipp - wenn Sie vim verwenden und dadurch der Anfang jeder Zeile hervorgehoben wird, fügen Sie ihn |noham Ende hinzu. Die Pipe trennt zusätzliche Befehle und nohist für Nohighlight. Die Hervorhebung von Suchbegriffen wird automatisch fortgesetzt, wenn Sie das nächste Mal nach etwas suchen. Beispiel::10,100s/^/#/g|noh
Matthew
Ich brauche dies, um von einem Skript aus automatisiert zu werden. Gibt es eine Möglichkeit, dies mit einer Datei mit vi zu tun, ohne dass eine menschliche Interaktion erforderlich ist?
Timothy Swan
1
@ TimothySwan Ich stelle mir vor, das Gawk- oder Sed-Programm könnte das tun ... irgendwie.
BeowulfNode42
Meine bevorzugte Methode zum Kommentieren (oder Präfixieren) eines Blocks mit vi: Gehen Sie zum Anfang der Zeile, in der Sie mit dem Kommentieren beginnen möchten (z. B. <SHIFT>+G 10 <ENTER>dann 0oder auf eine andere Art zu navigieren). Dann benutze<CTRL>+V um in den visuellen Blockmodus zu wechseln und den Anfang aller Zeilen zu markieren, die Sie kommentieren möchten (in diesem Beispiel 90 J). Drücken Sie dann SHIFT+I, um vor dem markierten Block einzufügen. Geben Sie das Kommentarzeichen ein (z. B. #) und drücken Sie <ESC>, um das Präfix zu beenden. Diese Erklärung klingt sehr lang, ist aber meiner Erfahrung nach in der Praxis viel schneller.
Ueffes
52

Sie können verwenden:

if [ 1 -eq 0 ]; then
  echo "The code that you want commented out goes here."
  echo "This echo statement will not be called."
fi
dannyhan12
quelle
14
Dies ist klassisch, funktioniert aber, wie stackoverflow.com/a/19409316/832230 feststellt, einfach if [ ];auch.
Acumenus
12
Vielleicht klarer : if false;. stackoverflow.com/a/18019516/2097284
Camille Goudeseune
3
Dies scheint nur zu funktionieren, wenn der kommentierte Text tatsächlich Code ist. Ich habe Probleme mit Kommentaren mit Pipes und Semikolons. Sunny256 Antwort hat funktioniert.
Swdev
noch prägnanter wäre []; mit Test, der ist
Justin Duncan
27

Die folgende Beschreibung ist für Arbeit sh, bash,ksh und zsh.

Die zu kommentierenden Codeblöcke können eingefügt werden BEGINCOMMENTund ENDCOMMENT:

[ -z $BASH ] || shopt -s expand_aliases
alias BEGINCOMMENT="if [ ]; then"
alias ENDCOMMENT="fi"

BEGINCOMMENT
  echo "This line appears in a commented block"
  echo "And this one too!"
ENDCOMMENT

echo "This is outside the commented block"

Das Ausführen des obigen Codes würde führen zu:

This is outside the commented block

Um Kommentar- der Codeblöcke so kommentiert, sagen wir

alias BEGINCOMMENT="if : ; then"

anstatt

alias BEGINCOMMENT="if [ ]; then"

im obigen Beispiel.

devnull
quelle
23

Wenn Sie den einfachen Anführungszeichen ausweichen können:

__='
blah blah comment.
'
vanvliet.eric
quelle
Ich mag das. Was bedeutet der doppelte Unterstrich? Soweit ich das beurteilen kann, handelt es sich nur um einen Variablennamen nach der Konvention, dass er als privat behandelt werden soll.
Schachofnerd
Bietet auch Syntaxhervorhebung in den meisten Editoren und kann bei Bedarf mit $ __ aufgerufen werden, obwohl ich aus Gründen der Übersichtlichkeit einen Variablennamen wie Dokumentation oder Dokumente vorschlagen würde.
Jasonleonhard
Sie können auch das Wort local in front ref hier
jasonleonhard
Dies sollte die beste Antwort sein. Setzen Sie einfach einen Dummy-Variablennamen anstelle der doppelten Unterstriche
B Abali
Versuchte dies, scheiterte aber, weil es ein -F 'gab;' innerhalb des Blocks auskommentieren.
yO_
15

Verwenden Sie : 'zu öffnen und 'zu schließen.

Beispielsweise:

: '
This is a
very neat comment
in bash
'

Dies ist aus Vegas Beispiel hier

Relative0
quelle
2
hack-ish, aber genial
Gergely Lukacsy
es ist das beste für mich.
DPalharini
14

In Vim:

  1. Gehen Sie zur ersten Blockzeile, die Sie kommentieren möchten
  2. shift-V (in den visuellen Modus wechseln), Markierungslinien im Block nach oben und unten markieren
  3. Führen Sie bei der Auswahl Folgendes aus :s/^/#/
  4. Der Befehl sieht folgendermaßen aus:

      :'<,'>s/^/#
  5. drücke Enter

z.B

shift-V
jjj
:s/^/#
<enter>
stefanB
quelle
7
Zum Kommentieren verwenden:s/^#/
Buge
Überprüfen Sie die Antwort von @ horta: stackoverflow.com/a/28376319/3506015 - es gibt noch weniger Tastendrücke!
Geedoubleya
4

Sie können den Visual Block-Modus von Vi / Vim verwenden, der für folgende Dinge entwickelt wurde:

Ctrl-V  
Highlight first element in rows you want commented  
Shift-i  
#  
esc  

Kommentar wäre:

Ctrl-V  
Highlight #'s  
d  
l  

Dies ist die interaktive Methode von vi, um solche Dinge zu tun, anstatt Zeilennummern zu zählen oder zu lesen.

Schließlich verwenden Sie in Gvim Strg-Q, um in den Visual Block-Modus zu gelangen, anstatt Strg-V (da dies die Verknüpfung zum Einfügen ist).

Horta
quelle
Ich liebe diese vereinfachte Methode. : o)
Geedoubleya
4

Um ehrlich zu sein, warum so viel Überentwicklung ...

Ich halte es für eine schlechte Praxis, aktiven Code zum Generieren von passivem Code zu schreiben.

Meine Lösung: Die meisten Editoren haben den Blockauswahlmodus. Verwenden Sie es einfach, um allen Zeilen, die Sie auskommentieren möchten, # hinzuzufügen. Was ist die große Sache ...

Beispiel für einen Notizblock:

So erstellen Sie: Drücken Sie bei gedrückter Alt-Taste nach unten #.

So löschen Sie: Alt-Mousedrag nach unten, Pfeil nach rechts, Löschen.

Rusty75
quelle
8
Der Benutzer befindet sich höchstwahrscheinlich im Terminal. Kann keine Mausumgebung annehmen.
Gary
Existieren sie noch? Normalerweise bearbeite ich im grafischen Modus und füge es mit vi wieder ein. Das wäre eine einfache Problemumgehung.
Rusty75
2

Eine Variation des Here-Doc-Tricks in der akzeptierten Antwort von sunny256 besteht darin, die Perl-Schlüsselwörter für Kommentare zu verwenden. Wenn es sich bei Ihren Kommentaren tatsächlich um eine Art Dokumentation handelt, können Sie die Perl-Syntax im kommentierten Block verwenden, mit der Sie sie gut formatiert ausdrucken, in eine Manpage konvertieren usw. können.

Soweit die Schale betrifft, so müssen Sie nur ersetzen , 'END'mit '=cut'.

echo "before comment"
: <<'=cut'
=pod

=head1 NAME
   podtest.sh - Example shell script with embedded POD documentation

etc.

=cut
echo "after comment"

(Gefunden unter " Einbetten der Dokumentation in ein Shell-Skript ")

mivk
quelle
0

Ein anderer Modus ist: Wenn Ihr Editor KEINE BLOCK-Kommentaroption hat,

  1. Öffnen Sie eine zweite Instanz des Editors (z. B. Datei => Neue Datei ...)
  2. Wählen Sie aus DER VORHERIGEN Datei, an der Sie arbeiten, NUR DEN TEIL aus, den Sie kommentieren möchten
  3. Kopieren Sie es und fügen Sie es in das Fenster der neuen temporären Datei ein ...
  4. Öffnen Sie das Menü Bearbeiten, wählen Sie ERSETZEN und geben Sie die zu ersetzende Zeichenfolge ein. '\ N'
  5. Eingabe als Ersetzungszeichenfolge: '\ n #'
  6. Drücken Sie die Taste 'ALLE ersetzen'

GETAN

es funktioniert mit jedem Editor

Mardocheo
quelle
0

Ich mag eine einzelne Zeile öffnen und schließen:

if [ ]; then ##
    ...
    ...
fi; ##

Das '##' hilft mir dabei, den Anfang und das Ende des Blockkommentars leicht zu finden. Ich kann eine Nummer nach dem '##' setzen, wenn ich ein paar davon habe. Um den Kommentar auszuschalten, stecke ich einfach eine '1' in das '[]'. Ich vermeide auch einige Probleme, die ich mit einfachen Anführungszeichen im kommentierten Block hatte.

Ynnub
quelle