In der Antwort auf diese Frage zu Kommentaren in Shell-Skripten wird angegeben, dass der :
Befehl null ist, der explizit nichts tut (aber nicht für Kommentare verwendet werden soll).
Was wäre der Nutzen eines Befehls, der absolut nichts tut?
shell
shell-script
DQdlM
quelle
quelle
:
es sich um eine eingebaute Frage handeln muss , während diestrue
nicht der Fall ist, die den Gültigkeitsbereich von Variablen beeinflusstAntworten:
Ich benutze normalerweise
true
in Schleifen; Ich denke es ist klarer:Der einzige Ort, den ich gefunden habe, der
:
wirklich praktisch ist, sind case-Anweisungen, wenn Sie etwas abgleichen müssen, aber eigentlich nichts tun möchten. Beispielsweise:quelle
true
für eine Bedingung,:
für eine NOP.case a in a ) ;; esac
. Gibt es einige Muscheln, die das nicht akzeptieren?case ${var} in value);; *) do_something;; esac
ist akzeptabel. Der:
Befehl wird für leere Fälle nicht benötigt.Ursprünglich wurde damit festgestellt, dass es sich im Gegensatz zu C-kompilierten Programmen um ein Bourne-Shell-Programm handelte. Dies war vor Shebang und mehreren Skriptsprachen (csh, perl). Sie können weiterhin ein Skript ausführen, das mit den folgenden Schritten beginnt
:
:In der Regel wird das Skript gegen
$SHELL
(oder/bin/sh
) ausgeführt.Seitdem besteht der Hauptzweck darin, die Argumente zu bewerten. Ich benutze noch:
um einen Standardwert in einem Skript festzulegen.
quelle
:
ist nützlich zum Schreiben von Schleifen, die von innen abgeschlossen werden müssen.Dies wird für immer ausgeführt, sofern nicht
break
oderexit
aufgerufen wird oder die Shell ein Beendigungssignal empfängt.quelle
while true; do ...; done
teilt dem Leser Absichten besser mit alswhile :; do ...; done
Wenn Sie in Shell-Skripten eine "wenn nicht" -Anweisung wünschen, verwenden Sie entweder eine "nicht" -Bedingung, die für einige der Tests doof aussehen kann, oder Sie verwenden ':' in der true-Klausel, mit echtem Code in der false- Klausel.
Der "exotische Zustand" könnte etwas sein, das Sie nicht negieren möchten, oder das ist nur viel klarer, wenn Sie keine "negative Logik" verwenden.
quelle
autoconf
angezeigt, die von generiert wurden, da es viel einfacher ist, einen Standard:
für leere Zweige hinzuzufügen, als herauszufinden, wie die Bedingung umgekehrt werden kann.!
davor zu[ some-exotic-condition ]
stecken, aber ein überflüssiges,: else
nachdem es nicht doof ist.!
Token negiert ein gesamtes Befehlspipe-Element.while ! grep ... ; do ... done
oderif ! [ ... ] ; then ... fi
. Es ist im Grunde genommen außerhalb dertest/[]
Syntax. Siehe: pubs.opengroup.org/onlinepubs/9699919799/utilities/…Ich habe dies immer nur zusätzlich zum Zeichen # zum vorübergehenden Auskommentieren einer Zeile verwendet, in einer Situation, in der das Auskommentieren der Zeile aufgrund eines Fehlers in der Shell-Grammatik, der darin besteht, keine leere Befehlsfolge zuzulassen, zu einem Syntaxfehler führt :
Ohne das: haben wir eine fehlende Befehlsfolge, was ein Syntaxfehler ist.
quelle
Es gibt zwei Fälle, in denen ich
:
nützlich finde :Standardmäßige Variablenzuweisungen
Auf diese bequeme Weise können Benutzer Ihres Shell-Skripts eine Einstellung überschreiben, ohne das Skript zu bearbeiten. ( Befehlszeilenargumente sind jedoch besser, da Sie nicht das Risiko eines unerwarteten Verhaltens eingehen, wenn der Benutzer zufällig die Variable hat, die Sie in seiner exportierten Umgebung verwenden.) So würde der Benutzer die Einstellung überschreiben:
In der
${VAR=value}
Syntax wird festgelegt, dass auf gesetzt werden sollVAR
,value
wenn diesVAR
noch nicht geschehen ist. Erweitern Sie dann auf den Wert der Variablen. Da uns der Wert der Variablen noch nicht wichtig ist, wird er als Argument an den Befehl no-op übergeben:
, um ihn zu verwerfen.Obwohl
:
es sich um einen No-Op-Befehl handelt, wird die Erweiterung von der Shell ausgeführt (nicht vom:
Befehl!), Bevor der:
Befehl ausgeführt wird, sodass die Variablenzuweisung weiterhin erfolgt (falls zutreffend).Es wäre auch akzeptabel,
true
stattdessen einen oder einen anderen Befehl zu verwenden:
, aber der Code wird schwieriger zu lesen, da die Absicht weniger klar ist.Das folgende Skript würde auch funktionieren:
Aber das Obige ist viel schwieriger zu pflegen. Wenn eine Zeile
${VAR}
über dieserprintf
Zeile hinzugefügt wird, muss die Standardzuweisungserweiterung verschoben werden. Wenn der Entwickler vergisst, diese Zuweisung zu verschieben, wird ein Fehler gemeldet.Etwas, das in einen leeren bedingten Block eingefügt werden kann
Leere bedingte Blöcke sollten im Allgemeinen vermieden werden, aber manchmal sind sie nützlich:
Einige Leute argumentieren, dass ein leerer True-
if
Block das Lesen von Code erleichtern kann, anstatt den Test zu negieren. Beispielsweise:ist wohl leichter zu lesen als:
Ich glaube jedoch, dass es einige alternative Ansätze gibt, die besser sind als ein leerer wahrer Block:
Setzen Sie die Bedingung in eine Funktion:
Setzen Sie die Bedingung in geschweifte Klammern (oder Klammern, aber Klammern rufen einen Subshell-Prozess hervor und alle Änderungen an der Umgebung innerhalb der Subshell sind außerhalb der Subshell nicht sichtbar), bevor Sie negieren:
Verwenden Sie
||
anstelle vonif
:Ich bevorzuge diesen Ansatz, wenn es sich bei der Reaktion um eine einfache Einzeilerreaktion handelt, z.
quelle
In der alten Pre-Bourne-Shell in früheren UNIX-Versionen war der
:
Befehl ursprünglich zum Angeben von Bezeichnungen für vorgesehengoto
(es war ein separater Befehl, der die Eingabe an die Stelle weiterleitet, an der sich die Bezeichnung befindet) Shell weiß über.if
war auch ein separater Befehl.) Es wurde bald für Kommentare verwendet, bevor es eine Kommentarsyntax gab (#
wurde für die Rücktaste verwendet) und heutzutage gibt es so gut wie Kompatibilität.quelle
Sie können es nicht nur als Anweisung verwenden, die nichts bewirkt, sondern Sie können auch einzelne Anweisungen auskommentieren, indem Sie sie in Argumente für Folgendes umwandeln:.
quelle
: echo write this line > myfile
immer noch eine leere Datei erstellt wird.:
ist KEIN Kommentar-Mechanismus ausreichend.