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$aundz*. - Erweitern Sie den ersten Operanden in den Wert der Variablen
a. - Werten Sie
==aus Operator:teste, ob der Wert der Variablenaist 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$agebildet werden ,==,z*,]. - Erweitern Sie
$ain den Wert der Variablena. - Führen Sie Wortaufteilung und Dateinamengenerierung mit den Parametern des Befehls durch.
- Zum Beispiel, wenn der Wert von
aist 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 =~ ).