Erwägen
echo \ # this is a comment
foo
Das gibt:
$ sh foo.sh
# this is a comment
foo.sh: line 2: foo: command not found
Nach einigen Recherchen im Internet habe ich auf der Schwestersite Stack Overflow eine Lösung von DigitalRoss gefunden . Also kann man machen
echo `: this is a comment` \
foo
oder alternativ
echo $(: this is a comment) \
foo
DigitalRoss erklärte jedoch nicht, warum diese Lösungen funktionieren. Ich würde mich über eine Erklärung freuen. Er antwortete mit einem Kommentar:
Früher gab es einen Shell-
goto
Befehl, der zu den:
hier angegebenen Bezeichnungen verzweigte . Dasgoto
ist weg, aber Sie können immer noch die: whatever
Syntax verwenden ...:
ist jetzt eine Art geparster Kommentar.
Aber ich hätte gerne mehr Details und Kontext, einschließlich einer Diskussion über Portabilität.
Wenn jemand andere Lösungen hat, wäre das natürlich auch gut.
Siehe auch die frühere Frage Wie kommentiere ich mehrzeilige Befehle in Shell-Skripten? .
Nachricht zum Mitnehmen aus der folgenden Diskussion. Dies `: this is a comment`
ist nur eine Befehlsersetzung. Die Ausgabe von : this is a comment
ist nichts, und das wird an die Stelle von gesetzt `: this is a comment`
.
Eine bessere Wahl ist die folgende:
echo `# this is a comment` \
foo
make_FIND
Ein Quickie-Skript, das eine lange Liste von Argumenten für erstelltfind
. Hier besteht die Motivation für die Erstellung eines Blocks nach dem anderen darin, dass jeder Block aus dem Körper einer Schleife stammt, derselbe Stil es jedoch ermöglicht, jeden Block zu kommentieren.Sie können dies mit Bash-Arrays erreichen, z
Dies definiert ein Array
$CMD
und erweitert es dann. Nach dem Erweitern wird die resultierende Zeile ausgewertet und in diesem Fallecho foo
ausgeführt.Der Text zwischen
(
und)
definiert das Array und unterliegt der üblichen Bash-Syntax, sodass alle Zeilen danach#
ignoriert werden.Hinweis zum Beibehalten von Leerzeichen in Anführungszeichen
${CMD[@]}
Wird zu einer einzelnen Zeichenfolge erweitert, die die Verkettung aller Elemente darstellt, die durch ein Leerzeichen getrennt sind. Einmal erweitert, parst Bash den String dann wie gewohnt in Token (vgl. $ IFS ), was oft nicht das ist, was wir wollen.Im Gegensatz dazu bleibt
"${CMD[@]}"
jedes Element im Array erhalten, wenn die Erweiterung in doppelte Anführungszeichen eingeschlossen wird. Betrachten Sie den Unterschied zwischenhello world second item
und"hello world" "second item"
.Bildhaftes Beispiel:
quelle
${CMD[@]}
wird nicht zu einer einzelnen Zeichenfolge erweitert. - Es wird auf viele Zeichenfolgen erweitert: Nicht nur für jedes Element des Arrays, sondern auch für jedes Leerzeichen in jedem Element. (Dh: völlig nutzlos)Sie nicht tun
$(: comment)
. Das ist kein Kommentar - das ist eine Subshell - ein weiterer ganz neuer Shell-Prozess für die meisten Shells. Ihr Ziel ist es , weniger mit Ihrer Eingabe zu tun , nicht mehr, und das ist, was das tun würde - auch wenn es sinnlos ist.Sie können stattdessen tun ...
Grundsätzlich passiert dort, dass die Shell eine Substitution durchführt. Es ersetzt den Wert des speziellen Shell-Parameters
$-
jedes Mal zweimal. Es ist ohnehin eine kurze Zeichenfolge, aber sie ist immer gesetzt - und daher wird die innere Ersetzung, die als Muster interpretiert wird, das von der äußeren entfernt wird, nicht auf den Inhalt zwischen den Klammern ausgedehnt, wenn ich das-
Erweiterungsformular verwende.Hier:
Sehen? Es ist also nur zweimal erweitert. Sobald die Shell feststellt, dass der Parameter gesetzt ist, wird fast alles im optionalen Erweiterungsfeld verworfen und es wird zu seinem gesamten Wert erweitert, der von sich selbst entfernt wird, und so zu gar nichts. In den meisten Shells müssen Sie nicht einmal Anführungszeichen entkommen, sondern es ist
bash
erforderlich.Besser noch ist:
quelle