559 Stimmen

Was ist der Unterschied zwischen [ und [[ in der Bash?

Ich habe mir die Bash-Manpage angesehen und die [[ sagt, dass es bedingte Ausdrücke verwendet. Dann habe ich mir den Abschnitt über bedingte Ausdrücke angesehen, und dort sind die gleichen Operatoren aufgeführt wie test (und [ ).

Ich frage mich also, was der Unterschied ist zwischen [ y [[ in Bash?

832voto

John Kugelman Punkte 327535

[[ ist die Verbesserung der Bash zum [ Befehl. Es hat mehrere Verbesserungen, die es zu einer besseren Wahl machen, wenn Sie Skripte schreiben, die auf die Bash abzielen. Meine Favoriten sind:

  1. Es handelt sich um ein syntaktisches Merkmal der Shell, so dass es ein spezielles Verhalten aufweist, das [ nicht hat. Sie müssen nicht mehr wie verrückt Variablen zitieren, denn [[ behandelt leere Zeichenketten und Zeichenketten mit Whitespace intuitiver. Zum Beispiel, mit [ müssen Sie schreiben

    if [ -f "$file" ]

    um leere Zeichenfolgen oder Dateinamen mit Leerzeichen korrekt zu behandeln. Mit [[ die Anführungszeichen sind unnötig:

    if [[ -f $file ]]
  2. Da es sich um ein syntaktisches Merkmal handelt, können Sie mit && y || Operatoren für boolesche Tests und < y > für String-Vergleiche. [ kann dies nicht tun, weil es ein regulärer Befehl ist und && , || , < y > werden nicht als Befehlszeilenargumente an reguläre Befehle übergeben.

  3. Es hat eine wunderbare =~ Operator für die Suche nach regulären Ausdrücken. Mit [ könnten Sie schreiben

    if [ "$answer" = y -o "$answer" = yes ]

    Mit [[ können Sie dies schreiben als

    if [[ $answer =~ ^y(es)?$ ]]

    Sie können sogar auf die erfassten Gruppen zugreifen, die sie in BASH_REMATCH . Zum Beispiel, ${BASH_REMATCH[1]} wäre "es", wenn Sie oben ein vollständiges "Ja" eingegeben hätten.

  4. Sie erhalten den Mustervergleich, auch Globbing genannt, kostenlos. Vielleicht sind Sie weniger streng bei der Eingabe von yes. Vielleicht ist es für Sie in Ordnung, wenn der Benutzer y-irgendwas eingibt. Wir haben alles für Sie:

    if [[ $ANSWER = y* ]]

Denken Sie daran, dass es sich um eine Bash-Erweiterung handelt, wenn Sie also sh-kompatible Skripte schreiben, müssen Sie sich an [ . Stellen Sie sicher, dass Sie die #!/bin/bash Shebang-Zeile für Ihr Skript, wenn Sie doppelte Klammern verwenden.

Siehe auch

50voto

Walter Mundt Punkte 23839
  • [ ist dasselbe wie die test gebaut und funktioniert wie das test binär (man test)
    • funktioniert ungefähr so wie [ in allen anderen sh-basierten Shells in vielen UNIX-ähnlichen Umgebungen
    • unterstützt nur eine einzige Bedingung. Mehrere Tests mit der bash && y || Operatoren müssen in separaten Klammern stehen.
    • unterstützt von Haus aus keinen 'not'-Operator. Um eine Bedingung zu invertieren, verwenden Sie einen ! außerhalb der ersten Klammer, um die Möglichkeit der Shell zu nutzen, Befehlsrückgabewerte zu invertieren.
    • == y != sind wörtliche String-Vergleiche
  • [[ ist eine Bash
    • ist bash-spezifisch, obwohl andere Shells ähnliche Konstrukte implementiert haben können. Erwarten Sie es nicht in einer UNIX-Shell der alten Schule.
    • == y != Bash-Musterübereinstimmungsregeln anwenden, siehe "Musterübereinstimmung" in man bash
    • hat eine =~ Regex-Match-Operator
    • erlaubt die Verwendung von Klammern und der ! , && y || logische Operatoren innerhalb der Klammern, um Teilausdrücke zu kombinieren

Abgesehen davon sind sie ziemlich ähnlich - die meisten individuellen Tests funktionieren identisch, interessant wird es erst, wenn man verschiedene Tests mit logischen UND/ODER/NICHT-Operationen kombinieren muss.

33voto

Anthony Rutledge Punkte 5794

Der wichtigste Unterschied wird die Übersichtlichkeit deines Codes. Ja, ja, was oben gesagt wurde, ist wahr, aber [[ ]] bringt Ihren Code in Einklang mit dem, was Sie in Hochsprachen erwarten würden, insbesondere im Hinblick auf AND ( && ), OR ( || ), und NOT ( ! ) Betreiber. Wenn Sie also zwischen Systemen und Sprachen wechseln, können Sie Skripte schneller interpretieren, was Ihnen das Leben erleichtert. Holen Sie sich das Wesentliche aus einer guten UNIX/Linux-Referenz. Sie werden feststellen, dass manches Detail unter bestimmten Umständen nützlich sein kann, aber Sie werden es immer zu schätzen wissen clair Code! Welches Skriptfragment würden Sie lieber lesen? Auch ohne Kontext ist die erste Wahl einfacher zu lesen und zu verstehen.


if [[ -d $newDir && -n $(echo $newDir | grep "^${webRootParent}") && -n $(echo $newDir | grep '/$') ]]; then ...

o

if [ -d "$newDir" -a -n "$(echo "$newDir" | grep "^${webRootParent}")" -a -n "$(echo "$newDir" | grep '/$')" ]; then ...

7voto

Xavier V. Punkte 5600

In der Bash, im Gegensatz zu [ , [[ verhindert die Worttrennung von Variablenwerten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X