Was ist der Unterschied zwischen den Bash-Operatoren [[vs [vs (vs ((?

)? Ich bin ein wenig verwirrt darüber, was diese Operatoren wann anders machen Wird in Bash verwendet (Klammern, doppelte Klammern, Klammern und doppelte Klammern).

[[ , [ , ( , (( 

Ich habe Leute gesehen, die sie für if-Anweisungen wie diese verwenden:

if [[condition]] if [condition] if ((condition)) if (condition) 

Kommentare

Antwort

In Bourne-ähnlichen Shells sieht eine if -Anweisung normalerweise wie

if command-list1 then command-list2 else command-list3 fi 

Die Klausel then wird ausgeführt, wenn der Exit-Code der Befehlsliste ist Null. Wenn der Exit-Code ungleich Null ist, wird die Klausel else ausgeführt. command-list1 kann einfach oder komplex sein. Dies kann beispielsweise eine Folge von einer oder mehreren Pipelines sein, die durch einen der Operatoren ;, &, &&, || oder Newline. Die unten gezeigten if -Bedingungen sind nur Sonderfälle von command-list1:

  1. if [ condition ]

    [ ist ein anderer Name für den traditionellen Befehl test. [ / test ist ein Standard-POSIX-Dienstprogramm. Alle POSIX-Shells haben es eingebaut (obwohl dies von POSIX² nicht benötigt wird). Der Befehl test legt einen Exit-Code und die Anweisung if fest Entspricht dementsprechend. Typische Tests sind, ob eine Datei vorhanden ist oder eine Nummer einer anderen entspricht.

  2. if [[ condition ]]

    Dies ist eine neue aktualisierte Variante von test ¹ von ksh that bash , zsh , yash , Busybox sh unterstützen ebenfalls. Dieses [[ ... ]] -Konstrukt setzt auch einen Exit-Code und das if verhält sich entsprechend. Unter den erweiterten Funktionen kann getestet werden, ob eine Zeichenfolge mit einem Platzhaltermuster übereinstimmt (nicht in Busybox Sh ).

  3. if ((condition))

    Eine weitere ksh -Erweiterung, die bash und zsh ebenfalls unterstützen. Dies führt eine Arithmetik durch. Als Ergebnis der Arithmetik wird ein Exit-Code gesetzt und die Anweisung if wirkt entsprechend rdingly. Es gibt einen Exit-Code von Null (true) zurück, wenn das Ergebnis der arithmetischen Berechnung ungleich Null ist. Wie [[...]] ist dieses Formular nicht POSIX und daher nicht portierbar.

  4. if (command)

    Hiermit wird der Befehl in einer Subshell ausgeführt. Wenn der Befehl abgeschlossen ist, wird ein Exit-Code festgelegt und die Anweisung if verhält sich entsprechend.

    Ein typischer Grund für die Verwendung einer solchen Subshell besteht darin, die Nebenwirkungen von zu begrenzen command wenn command Variablenzuweisungen oder andere Änderungen an der Shell-Umgebung erforderlich sind. Solche Änderungen bleiben nach Abschluss der Subshell nicht erhalten.

  5. if command

    wird ausgeführt und die Anweisung if wird ausgeführt gemäß seinem Exit-Code.


¹ obwohl nicht wirklich ein Befehl, sondern ein spezielles Shell-Konstrukt mit einer eigenen Syntax, die von der des normalen Befehls getrennt ist. und signifikante Unterschiede zwischen Shell-Implementierungen

² POSIX erfordert, dass es ein eigenständiges test und [ Dienstprogramme auf dem System, obwohl im Fall von [ mehrere Linux-Distributionen als m bekannt sind Ausgabe.

Kommentare

  • Vielen Dank, dass Sie die 5. Option hinzugefügt haben. Dieser ‚ ist der Schlüssel zum Verständnis, wie dies tatsächlich funktioniert, und wird überraschenderweise nicht ausreichend genutzt.
  • Beachten Sie, dass [ tatsächlich ein ist binär, kein interner Befehl oder Symbol. Lebt im Allgemeinen in /bin.
  • @JulienR. Tatsächlich ist [ integriert, ebenso wie test. Aus Kompatibilitätsgründen sind Binärversionen verfügbar. Schauen Sie sich help [ und help test an.
  • Beachten Sie, dass while ((ist nicht POSIX, dh arithmetische Erweiterung ist und es ist ‚ leicht, sie zu verwirren. Oft besteht eine Problemumgehung darin, etwas wie [ $((2+2)) -eq 4 ] zu verwenden Um Arithmetik in Bedingungsaussagen zu verwenden
  • Ich wünschte, ich könnte diese Antwort mehr als einmal abstimmen. Perfekte Erklärung.

Antwort

  • (…) Klammern geben ein Subshell . Was in ihnen ist, ist kein Ausdruck wie in vielen anderen Sprachen. Es ist eine Liste von Befehlen (genau wie außerhalb von Klammern). Diese Befehle werden in einem separaten Unterprozess ausgeführt, sodass jede Umleitung, Zuweisung usw., die innerhalb der Klammern ausgeführt wird, außerhalb der Klammern keine Auswirkung hat.
    • Mit einem führenden Dollarzeichen, $(…) ist eine Befehlssubstitution : In den Klammern befindet sich ein Befehl und die Ausgabe des Befehls wird als Teil der Befehlszeile verwendet (nach zusätzlichen Erweiterungen, es sei denn, die Ersetzung erfolgt zwischen doppelten Anführungszeichen, aber „s eine andere Geschichte ).
  • { … } Klammern sind insofern wie Klammern, als sie Befehle gruppieren, aber nur das Parsen beeinflussen, nicht das Gruppieren. Das Programm x=2; { x=4; }; echo $x gibt 4 aus, während x=2; (x=4); echo $x 2 ausgibt. (Auch geschweifte Klammern, die Schlüsselwörter sind, müssen begrenzt werden und gefunden in Befehlsposition (daher das Leerzeichen nach { und das ; vor }) Klammern nicht „t. Das ist nur eine Syntax-Eigenart.)
    • Mit einem führenden Dollarzeichen ist ${VAR} ein Parametererweiterung , erweitert auf den Wert einer Variablen, mit möglichen zusätzlichen Transformationen. Die ksh93 -Shell unterstützt auch ${ cmd;} als Form der Befehlssubstitution, die keine Subshell erzeugt.
  • ((…)) doppelte Klammern umgeben eine arithmetische Anweisung , dh eine Berechnung auf ganzen Zahlen, mit Eine Syntax, die anderen Programmiersprachen ähnelt. Diese Syntax wird hauptsächlich für Zuweisungen und in Bedingungen verwendet. Sie existiert nur in ksh / bash / zsh, nicht in normalem sh.
    • Dieselbe Syntax wird in arithmetischen Ausdrücken $((…)), die auf den ganzzahligen Wert des Ausdrucks erweitert werden.
  • [ … ] einzelne Klammern umgeben bedingte Ausdrücke . Bedingte Ausdrücke basieren hauptsächlich auf -Operatoren wie -n "$variable", um zu testen, ob eine Variable leer ist, und -e "$file", um zu testen, ob eine Datei vorhanden ist. Beachten Sie, dass Sie jeweils ein Leerzeichen benötigen Operator (z. [ "$x" = "$y" ], nicht [ "$x"="$y" ] ) und ein Leerzeichen oder ein Zeichen wie ; sowohl innerhalb als auch außerhalb der Klammern (z. B. [ -n "$foo" ], nicht [-n "$foo"] ).
  • [[ … ]] doppelte Klammern sind eine alternative Form von bedingten Ausdrücken in ksh / bash / zsh mit einigen zusätzlichen Funktionen. Sie können beispielsweise , um zu testen, ob eine Datei eine symbolische Verknüpfung zu einer regulären Datei ist, während für einzelne Klammern [ -L "$file" ] && [ -f "$file" ] erforderlich ist. Weitere Informationen zu diesem Thema finden Sie unter Warum funktioniert die Parametererweiterung mit Leerzeichen ohne Anführungszeichen in doppelten Klammern [[, jedoch nicht in einfachen Klammern [? ?

In der Shell ist jeder Befehl ein bedingter Befehl: Jeder Befehl hat einen Rückgabestatus, der entweder 0 für Erfolg oder eine Ganzzahl zwischen 1 und 255 (und möglicherweise mehr in einigen Shells) anzeigt Fehler. Der Befehl [ … ] (oder die Syntaxform [[ … ]]) ist ein bestimmter Befehl, der auch test … und ist erfolgreich, wenn eine Datei vorhanden ist oder wenn eine Zeichenfolge nicht leer ist oder wenn eine Zahl kleiner als eine andere ist usw. Das Syntaxformular ((…)) ist erfolgreich, wenn eine Zahl ungleich Null ist .Hier einige Beispiele für Bedingungen in einem Shell-Skript:

  • Testen Sie, ob myfile die Zeichenfolge hello:

    if grep -q hello myfile; then … 
  • Wenn mydir ein Verzeichnis ist, wechseln Sie zu it and do stuff:

    if cd mydir; then echo "Creating mydir/myfile" echo "some content" >myfile else echo >&2 "Fatal error. This script requires mydir to exist." fi 
  • Testen Sie, ob es eine Datei mit dem Namen myfile gibt im aktuellen Verzeichnis:

    if [ -e myfile ]; then … 
  • Dasselbe, aber auch mit baumelnden symbolischen Links:

    if [ -e myfile ] || [ -L myfile ]; then … 
  • Testen Sie, ob der Wert von x (der als numerisch angenommen wird) mindestens 2 beträgt, portabel:

    if [ "$x" -ge 2 ]; then … 
  • Testen Sie, ob der Wert von x (der als numerisch angenommen wird) ist mindestens 2 in bash / ksh / zsh:

    if ((x >= 2)); then … 

Kommentare

  • Beachten Sie, dass eine einzelne Klammer die -a anstelle von &&, damit man schreiben kann: [ -L $file -a -f $file ], das ist die gleiche Anzahl von Zeichen in den Klammern ohne die zusätzlichen [ und ]
  • @AlexisWilke Die Operatoren -a und -o sind problematisch, weil sie zu falschen Analysen führen können, wenn einige der beteiligten Operanden wie Operatoren aussehen. Das ‚ ist der Grund, warum ich sie ‚ nicht erwähne: Sie haben keinen Vorteil und ‚ funktioniert nicht immer. Und schreiben Sie niemals nicht zitierte Variablenerweiterungen ohne guten Grund: [[ -L $file -a -f $file ]] ist in Ordnung, aber mit einzelnen Klammern benötigen Sie [ -L "$file" -a -f "$file" ] (was in Ordnung ist, z. B. wenn $file beginnt immer mit / oder ./).
  • Beachten Sie dies es ‚ s [[ -L $file && -f $file ]] (nein -a mit der [[...]] Variante).

Antwort

[ vs [[

Diese Antwort behandelt das [ vs [[ Teilmenge der Frage.

Einige Unterschiede in Bash 4.3.11:

  • POSIX vs Bash-Erweiterung:

  • regulärer Befehl gegen Magie

    • [ ist nur ein regulärer Befehl mit einem seltsamen Namen.

      ] ist nur das letzte Argument von [.

    Ubuntu 16.04 verfügt tatsächlich über eine ausführbare Datei unter /usr/bin/[, die von coreutils , aber die in bash integrierte Version hat Vorrang.

    An der Art und Weise, wie Bash den Befehl analysiert, wird nichts geändert.

    Insbesondere < ist Umleitung, && und || verketten mehrere Befehle, ( ) generiert Unterschalen, sofern sie nicht von \ maskiert werden und die Worterweiterung wie gewohnt erfolgt.

    • [[ X ]] ist Ein einzelnes Konstrukt, mit dem X magisch analysiert werden kann. <, &&, || und () werden speziell behandelt und die Regeln für die Wortaufteilung sind unterschiedlich.

      Es gibt auch weitere Unterschiede wie = und =~

    In Bashese: [ ist ein integrierter Befehl und [[ ist ein Schlüsselwort: https://askubuntu.com/questions/445749/whats-the-difference-between-shell-builtin-and-shell-keyword

  • <

  • && und ||

    • [[ a = a && b = b ]]: true, logisch und
    • [ a = a && b = b ]: Syntaxfehler, && als UND-Befehlstrennzeichen analysiert cmd1 && cmd2
    • [ a = a ] && [ b = b ]: POSIX zuverlässiges Äquivalent
    • [ a = a -a b = b ]: fast äquivalent, aber von POSIX veraltet, weil es verrückt ist und schlägt für einige Werte von a oder b wie ! oder , die als logische Operationen interpretiert werden würde
  • (

    • [[ (a = a || a = b) && a = b ]]: false. Ohne ( ) wäre dies wahr, da [[ && ]] eine höhere Priorität hat als [[ || ]]
    • [ ( a = a ) ]: Syntaxfehler, () wird als Unterschale interpretiert
    • [ \( a = a -o a = b \) -a a = b ]: äquivalent, aber (), -a und -o sind veraltet von POSIX. Ohne \( \) wahr, da -a eine höhere Priorität hat als -o
    • { [ a = a ] || [ a = b ]; } && [ a = b ] nicht veraltetes POSIX-Äquivalent. In diesem speziellen Fall hätten wir jedoch nur schreiben können: [ a = a ] || [ a = b ] && [ a = b ], weil die || und && Shell-Operatoren haben im Gegensatz zu [[ || ]] und [[ && ]] und -o, -a und [
  • Wortaufteilung und Dateinamengenerierung bei Erweiterungen (split + glob )

    • x="a b"; [[ $x = "a b" ]]: true, Anführungszeichen nicht erforderlich
    • x="a b"; [ $x = "a b" ]: Syntax Fehler, erweitert auf [ a b = "a b" ]
    • x="*"; [ $x = "a b" ]: Syntaxfehler, wenn sich mehr als eine Datei im aktuellen Verzeichnis befindet .
    • x="a b"; [ "$x" = "a b" ]: POSIX-Äquivalent
  • =

    • [[ ab = a? ]]: true, da Musterabgleich ( * ? [ sind magisch). Wird nicht auf f erweitert Dateien im aktuellen Verzeichnis.
    • [ ab = a? ]: a? glob wird erweitert. Dies kann je nach den Dateien im aktuellen Verzeichnis wahr oder falsch sein.
    • [ ab = a\? ]: false, keine globale Erweiterung
    • = und == sind sowohl in [ als auch in [[, aber == ist eine Bash-Erweiterung.
    • case ab in (a?) echo match; esac: POSIX-Äquivalent
    • [[ ab =~ "ab?" ]]: false, verliert Magie mit "" in Bash 3.2 und höher und vorausgesetzt, die Kompatibilität mit Bash 3.1 ist nicht aktiviert (wie bei BASH_COMPAT=3.1)
    • [[ ab? =~ "ab?" ]]: true
  • =~

    • [[ ab =~ ab? ]]: true, POSIX erweitert regulärer Ausdruck Übereinstimmung, ? wird nicht global erweitert
    • [ a =~ a ]: Syntaxfehler. Kein Bash-Äquivalent.
    • printf "ab\n" | grep -Eq "ab?": POSIX-Äquivalent (nur einzeilige Daten)
    • awk "BEGIN{exit !(ARGV[1] ~ ARGV[2])}" ab "ab?": POSIX-Äquivalent.
  • Empfehlung: Verwenden Sie immer []

    Es gibt POSIX-Äquivalente für jedes [[ ]] Konstrukt, das ich gesehen habe.

    Wenn Sie [[ ]] verwenden, müssen Sie:

    • die Portabilität verlieren
    • den Leser dazu zwingen, die Feinheiten einer anderen Bash-Erweiterung zu lernen. [ ist nur ein regulärer Befehl mit einem seltsamen Namen, es ist keine spezielle Semantik erforderlich.

    Dank Stéphane Chazelas für wichtige Korrekturen und Ergänzungen.

    Kommentare

    • @St é phaneChazelas danke für die Info! Ich ‚ habe expr zur Antwort hinzugefügt. Der Begriff “ Bash ex Spannung “ soll nicht bedeuten, dass Bash die erste Shell war, die Syntax hinzufügte. Das Erlernen von POSIX sh gegen Bash ist bereits genug, um mich verrückt zu machen.
    • Siehe man test, wenn Sie man [ ausprobiert haben und verloren gegangen sind. Das erklärt die POSIX-Variante.
    • Korrektur: ] ist ein Argument für den Befehl [, jedoch nicht t verhindert, dass weitere Argumente verwendet werden. ] muss das letzte Argument für [ sein, kann aber auch als Teil des Testausdrucks auftreten. Beispielsweise testet if [ "$foo" = ] ]; then, ob die Variable foo auf „] “ (wie auch if [ ] = "$foo" ]; then).
    • @GordonDavisson danke, ich habe nicht ‚ Ich weiß das nicht, behoben.
    • @ tgm1024 – Monicawasmistreated ja, das ist auch eine gültige Überlegung.

    Antwort

    Aus der Bash-Dokumentation :

    (list) -Liste wird in einer Subshell-Umgebung ausgeführt (siehe COMMAND EXECUTION ENVIRONMENT unten). Variablenzuweisungen und integrierte Befehle, die sich auf die Umgebung der Shell auswirken, bleiben nach Abschluss des Befehls nicht wirksam. Der Rückgabestatus ist der Beendigungsstatus der Liste.

    Mit anderen Worten, Sie stellen sicher, dass alles, was in „list“ passiert (wie eine cd), keine Auswirkung außerhalb der ( und hat ). Das einzige, was ausläuft, ist der Exit-Code des letzten Befehls oder mit set -e der erste Befehl, der einen Fehler erzeugt (andere als einige wenige wie if, while usw.)

    ((expression)) Der Ausdruck wird gemäß den unten unter ARITHMETISCHE BEWERTUNG beschriebenen Regeln ausgewertet. Wenn der Wert des Ausdrucks nicht Null ist, ist der Rückgabestatus 0, andernfalls der Rückgabestatus ist 1. Dies entspricht genau dem Ausdruck “ „.

    Dies ist eine Bash-Erweiterung, mit der Sie rechnen können. Dies ähnelt der Verwendung von expr ohne alle Einschränkungen von expr (z. B. überall Leerzeichen haben und usw.)

    [[ expression ]] Gibt je nach Status den Status 0 oder 1 zurück Auswertung des Ausdrucks des bedingten Ausdrucks. Ausdrücke setzen sich aus den nachstehend unter BEDINGTE AUSDRÜCKE beschriebenen Primärfarben zusammen. Wortaufteilung und Pfadnamenerweiterung werden für die Wörter zwischen [[und]] nicht durchgeführt. Tilde-Erweiterung, Parameter- und Variablenerweiterung, arithmetische Erweiterung, Befehlssubstitution, Prozessersetzung und Anführungszeichenentfernung werden durchgeführt. Bedingte Operatoren wie -f müssen nicht in Anführungszeichen gesetzt werden, um als Primäroperatoren erkannt zu werden.

    Bei Verwendung mit [[, < und > -Operatoren sortieren lexikografisch nach dem aktuellen Gebietsschema.

    Dies bietet einen erweiterten Test zum Vergleichen von Zeichenfolgen, Zahlen und Dateien ein wenig wie test bietet, aber leistungsfähiger.

    [ expr ] Gibt den Status von zurück 0 (wahr) oder 1 (falsch) abhängig von der Bewertung des bedingten Ausdrucks expr. Jeder Operator und jede Oper muss ein separates Argument sein. Ausdrücke setzen sich aus den oben unter BEDINGTE AUSDRÜCKE beschriebenen Vorwahlen zusammen. test akzeptiert keine Optionen und akzeptiert und ignoriert auch kein Argument von – als Zeichen für das Ende von Optionen.

    […]

    Dieser ruft test auf. In früheren Zeiten war [ eine symbolische Verbindung zu test. Es funktioniert genauso und Sie haben die gleichen Einschränkungen. Da eine Binärdatei den Namen kennt, mit dem sie gestartet wurde, weiß das Testprogramm, wann sie als [ gestartet wurde, und kann ihren letzten Parameter ignorieren, der voraussichtlich ]. Unterhaltsame Unix-Tricks.

    Beachten Sie, dass im Fall von bash [ und test sind integrierte Funktionen (wie in einem Kommentar erwähnt), es gelten jedoch nahezu dieselben Einschränkungen.

    Kommentare

    • Obwohl test und [ sind natürlich in Bash integrierte Befehle, aber es ist wahrscheinlich, dass ‚ ein Es gibt auch eine externe Binärdatei.
    • Die externe Binärdatei für [ ist auf den meisten modernen Systemen keine symbolische Verknüpfung zu test .
    • Irgendwie finde ich es amüsant, dass sie sich die Mühe machen, zwei separate Binärdateien zu erstellen, die beide genau das haben, was sie brauchen, anstatt sie nur zu kombinieren und ein paar Bedingungen hinzuzufügen. Obwohl strings /usr/bin/test tatsächlich zeigt, dass es auch den Hilfetext enthält, weiß ich ‚ nicht, was ich sagen soll.
    • @ Random832 Ich verstehe Ihren Standpunkt zur GNU-Begründung, um unerwartetes arg0-Verhalten zu vermeiden, aber zu POSIX-Anforderungen würde ich ‚ nicht so positiv sein. Während der Befehl test offensichtlich standardmäßig als eigenständiger dateibasierter Befehl vorhanden sein muss, gibt nichts darin an, dass seine [ -Variante erforderlich ist auch so umgesetzt werden. Beispielsweise stellt Solaris 11 ‚ keine [ ausführbare Datei bereit, entspricht jedoch vollständig den POSIX-Standards
    • (Exit 1) wirkt sich außerhalb der Klammern aus.

    Antwort

    Einige Beispiele:

    Traditioneller Test:

    foo="some thing" # check if value of foo is not empty if [ -n "$foo" ] ; then... if test -n "$foo" ; then... 

    test und [ sind Befehle wie alle anderen, daher wird die Variable in Wörter aufgeteilt, sofern sie nicht in Anführungszeichen steht.

    Test im neuen Stil

    [[ ... ]] ist a (neueres) spezielles Shell-Konstrukt, das etwas anders funktioniert. Das offensichtlichste ist, dass es keine wortgeteilten Variablen gibt:

    if [[ -n $foo ]] ; then... 

    Einige Dokumentation zu [ und [[ hier .

    Arithmetischer Test:

    foo=12 bar=3 if (( $foo + $bar == 15 )) ; then ... 

    „Normal „Befehle:

    Alle oben genannten Befehle verhalten sich wie normale Befehle, und if kann jeden Befehl annehmen:

    # grep returns true if it finds something if grep pattern file ; then ... 

    Mehrere Befehle:

    Oder wir können mehrere Befehle verwenden. Wenn Sie eine Reihe von Befehlen in ( ... ) einschließen, werden sie in einer Subshell ausgeführt, wodurch eine temporäre Kopie des Shell-Status (Arbeitsverzeichnis, Variablen) erstellt wird So führen Sie ein Programm vorübergehend in einem anderen Verzeichnis aus:

    # this will move to $somedir only for the duration of the subshell if ( cd $somedir ; some_test ) ; then ... # while here, the rest of the script will see the new working # directory, even after the test if cd $somedir ; some_test ; then ... 

    Antwort

    Gruppierungsbefehle

    Bash bietet zwei Möglichkeiten, eine Liste von Befehlen zu gruppieren, die als Einheit ausgeführt werden sollen.

    ( list ) Durch das Platzieren einer Liste von Befehlen in Klammern wird eine Subshell-Umgebung erstellt und jeder der Befehle in der Liste in dieser Subshell ausgeführt. Da die Liste ist In einer Unterschale ausgeführt, bleiben Variablenzuweisungen nach Abschluss der Unterschale nicht wirksam.

    $ a=1; (a=2; echo "inside: a=$a"); echo "outside: a=$a" inside: a=2 outside: a=1 

    { list; } Platzieren von a Die Liste der Befehle zwischen geschweiften Klammern bewirkt, dass die Liste im aktuellen Shell-Kontext . Es wird keine Unterschale erstellt. Die folgende Liste mit Semikolon (oder Zeilenumbruch) ist erforderlich. Quelle

    ${} Parameter expansion Ex: ANIMAL=duck; echo One $ANIMAL, two ${ANIMAL}s $() Command substitution Ex: result=$(COMMAND) $(()) Arithmetic expansion Ex: var=$(( 20 + 5 )) 

    Bedingte Konstrukte

    Einzelne Klammer dh []
    Zum Vergleich ==, !=, <, und > und sollte verwendet werden und zum numerischen Vergleich eq, ne,lt und gt sollte verwendet werden.

    Erweiterte Klammern dh [[]]

    In allen obigen Beispielen haben wir nur einzelne Klammern verwendet, um den bedingten Ausdruck einzuschließen. Bash erlaubt jedoch doppelte Klammern, die als erweiterte Version der Syntax für einzelne Klammern dienen.

    Zum Vergleich können ==, !=, <, und > wörtlich verwendet werden.

    • [ ist ein Synonym für Testbefehl. Selbst wenn es in die Shell integriert ist, wird ein neuer Prozess erstellt.
    • [[ ist eine neue verbesserte Version davon, bei der es sich um ein Schlüsselwort und nicht um ein Programm handelt
    • [[ wird unter Korn und Bash verstanden.

    Quelle

    Schreibe einen Kommentar

    Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.