GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Der Unterschied zwischen [[ $a ==Z* ]] und [ $a ==Z* ]?

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:

  1. Parse den Befehl:das ist der [[ … ]] bedingtes Konstrukt um den bedingten Ausdruck $a == z* .
  2. Parsen Sie den bedingten Ausdruck:Dies ist der == binärer Operator, mit den Operanden $a und z* .
  3. Erweitern Sie den ersten Operanden in den Wert der Variablen a .
  4. Werten Sie == aus Operator:teste, ob der Wert der Variablen a ist entspricht dem Muster z* .
  5. Bewerten Sie den Bedingungsausdruck:Sein Ergebnis ist das Ergebnis des Bedingungsoperators.
  6. 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:

  1. Parse den Befehl:Dies ist der [ Befehl mit den Argumenten, die durch Auswertung der Wörter $a gebildet werden , == , z* , ] .
  2. Erweitern Sie $a in den Wert der Variablen a .
  3. Führen Sie Wortaufteilung und Dateinamengenerierung mit den Parametern des Befehls durch.
    • Zum Beispiel, wenn der Wert von a ist die 6-stellige Zeichenfolge foo 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 , ] .
  4. 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.

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 =~ ).

Verwandt:Übereinstimmende Zeile und n-te Zeile aus der übereinstimmenden Zeile drucken?
Linux
  1. Was ist der Unterschied zwischen Sudo Su – und Sudo Su –?

  2. Centos – Der Unterschied zwischen Shutdown 18:00 und Shutdown um 18:00?

  3. Der Unterschied zwischen 'env' und 'printenv'?

  4. Der Unterschied zwischen Lubuntu und Lxde?

  5. Was ist der Unterschied zwischen strtok_r und strtok_s in C?

Was ist der Unterschied zwischen Linux und Unix?

Was ist ein Hypervisor? Was ist der Unterschied zwischen Typ 1 und 2?

Was ist der Unterschied zwischen Curl und Wget?

Unterschied zwischen dem Java-Heap und dem nativen C-Heap

Was ist der Unterschied zwischen adduser und useradd?

Was ist der Unterschied zwischen ls und l?