Gibt es einen Unterschied zwischen diesen beiden.
[[ $a == z* ]]
und
[ $a == z* ]
Kann ich ein Beispiel haben, wo sie unterschiedliche Ausgaben haben würden?
Außerdem, wie funktioniert [[ ]]
unterscheidet sich von [ ]
?
Akzeptierte Antwort:
Der Unterschied zwischen [[ … ]]
und [ … ]
wird hauptsächlich in Warum funktioniert die Parametererweiterung mit Leerzeichen ohne Anführungszeichen in doppelten Klammern „[[“, aber nicht in einfachen Klammern „[“?“ behandelt.
Entscheidend ist, [[ … ]]
ist eine spezielle Syntax, während [
ist ein komisch aussehender Name für einen Befehl. [[ … ]]
hat spezielle Syntaxregeln für den Inhalt, [ … ]
nicht.
Mit der hinzugefügten Falte eines Platzhalters, hier ist, wie [[ $a == z* ]]
wird ausgewertet:
- Parse den Befehl:das ist der
[[ … ]]
bedingtes Konstrukt um den bedingten Ausdruck$a == z*
. - Parsen Sie den bedingten Ausdruck:Dies ist der
==
binärer Operator, mit den Operanden$a
undz*
. - Erweitern Sie den ersten Operanden in den Wert der Variablen
a
. - Werten Sie
==
aus Operator:teste, ob der Wert der Variablena
ist entspricht dem Musterz*
. - Bewerten Sie den Bedingungsausdruck:Sein Ergebnis ist das Ergebnis des Bedingungsoperators.
- Der Befehl wird nun ausgewertet, sein Status ist 0, wenn der Bedingungsausdruck wahr war, und 1, wenn er falsch war.
So funktioniert [ $a == z* ]
wird ausgewertet:
- Parse den Befehl:Dies ist der
[
Befehl mit den Argumenten, die durch Auswertung der Wörter$a
gebildet werden ,==
,z*
,]
. - Erweitern Sie
$a
in den Wert der Variablena
. - Führen Sie Wortaufteilung und Dateinamengenerierung mit den Parametern des Befehls durch.
- Zum Beispiel, wenn der Wert von
a
ist die 6-stellige Zeichenfolgefoo b*
(Erhalten durch z. B.a='foo b*'
) und die Liste der Dateien im aktuellen Verzeichnis ist (bar
,baz
,qux
,zim
,zum
), dann ist das Ergebnis der Erweiterung die folgende Liste von Wörtern:[
,foo
,bar
,baz
,==
,zim
,zum
,]
.
- Zum Beispiel, wenn der Wert von
- Führen Sie den Befehl
[
aus mit den im vorherigen Schritt erhaltenen Parametern.- Mit den obigen Beispielwerten wird der
[
Befehl beschwert sich über einen Syntaxfehler und gibt den Status 2 zurück.
- Mit den obigen Beispielwerten wird der
Hinweis:In [[ $a == z* ]]
, bei Schritt 3, der Wert von a
wird keiner Wortaufteilung und Dateinamengenerierung unterzogen, da es sich in einem Kontext befindet, in dem ein einzelnes Wort erwartet wird (das linke Argument des Bedingungsoperators ==
). Wenn ein einzelnes Wort an dieser Position sinnvoll ist, verhält sich die Variablenerweiterung in den meisten Fällen wie in doppelten Anführungszeichen. Es gibt jedoch eine Ausnahme von dieser Regel:in [[ abc == $a ]]
, wenn der Wert von a
enthält Platzhalter, dann abc
wird mit dem Platzhaltermuster abgeglichen. Wenn beispielsweise der Wert von a
ist a*
dann [[ abc == $a ]]
wahr ist (weil der Platzhalter *
kommt von der nicht in Anführungszeichen gesetzten Erweiterung von $a
stimmt mit bc
überein ) während [[ abc == "$a" ]]
ist falsch (weil das gewöhnliche Zeichen *
kommt von der zitierten Erweiterung von $a
stimmt nicht mit bc
überein ). Innerhalb von [[ … ]]
, machen doppelte Anführungszeichen keinen Unterschied, außer auf der rechten Seite der String-Matching-Operatoren (=
, ==
, !=
und =~
).