Bash-Vergleichs- und Ausdrucksoperatoren

11

Ich bin neu in der Bash-Programmierung. Ich habe zwei gute, lange Anleitungen gelesen, aber sie haben in meinem Kopf ein Chaos über Operatoren und Schlüsselwörter verursacht.

Welche sind häufiger und weit verbreitet? Ich weiß nicht, wann ich welche verwenden soll und warum.

  1. test, [[ ]]Oder [ ]oder sogar(( ))
  2. $((exp)) oder $[exp]
  3. -gtoder >, geoder >=usw.
  4. wann zu verwenden <und >oder ( )und wann wir es mit \: \< \(etc. entkommen müssen .
  5. ==oder =(Zeichenfolgenvergleiche)

Ich kenne die grundlegenden Unterschiede zwischen [und [[aber andere Fragen sind mir ein Rätsel.

Danke im Voraus

MikeD
quelle
2
Ein sehr nützliches Wiki, das auf dem neuesten Stand ist und viele gute Praktiken erwähnt, ist Gregs Wiki . Der Bash-Leitfaden und die dortigen FAQ sind besonders nützlich.

Antworten:

5
  • testist eine eingebaute Shell, die (offensichtlich) auf eine bestimmte Bedingung prüft. Einige ältere Muscheln benötigen einen speziellen Befehl. So finden Sie auch ein Programm unter /usr/bin/test.
  • [ist auch ein Programm zum Testen auf bestimmte Bedingungen. Diese Software benötigt auch eine schließende Klammer und Sie finden sie unter /usr/bin/[.
  • [[…]]ist eine Alternative zu testund [. Es wurde für die Korn-Shell entwickelt ( ksh). Sie finden es aber auch in Bash-Versionen größer als 2 und in der Z-Shell. Die doppelten Klammern haben einige raffinierte Merkmale:
    • Die Shell führt keine Wortteilung oder Dateinamenerweiterung durch.
    • Sie brauchen kein Zitat.
    • Anstelle von -a(UND) oder -o(ODER) können Sie &&oder verwenden ||.
    • Die =können noch viel mehr.
  • ((…))ist äquivalent zu let. Also im Grunde ((expression))ist das gleiche wie let "expression". Jedoch mit letSie können mehr als einen Ausdruck verwenden, aber doppelte Klammern erlauben nur einen Ausdruck.
  • $((…))(und auch $[…]) führt einige Berechnungen durch. Ihre Shell versucht, den Ausdruck in geschweiften Klammern zu berechnen, und ersetzt den Ausdruck durch das Ergebnis. Also echo $((1+1))führt zu echo 2. Ihre Muscheln drucken also die Nummer 2.

Jedes Mal , wenn Sie möchten , um zwei Zahlen vergleichen , sollen Sie die Möglichkeit , mit einem Bindestrich und zwei Buchstaben ( -ge, -ltetc.). Wenn Sie Zeichenfolgen vergleichen möchten, sollten Sie =oder verwenden !=.

Ihre Frage bezüglich der Flucht ist ziemlich schwer zu beantworten. Weil es von der Software abhängt, die Sie neben der Shell verwenden. Also dh grepund grep -Ebrauche andere Flucht. Dies ist auch der Fall mit sed, awkund andere. Die beste Option ist also, einen Blick auf die Manpage zu werfen. Nach einiger Zeit gewöhnt man sich daran und weiß, wann man Flucht benutzt.

qbi
quelle
Danke. Eine weitere Frage - da es möglich ist, Vergleiche mit ((...)) durchzuführen - ist es üblicher, diese Version zu verwenden: if ((2> 1)) ODER dies: if [[2 -gt 1]]
MikeD
Ich würde annehmen, dass dies if [ 2 -gt 1 ]; …häufiger vorkommt, da ich dies häufiger in Shell-Skripten sehe und soweit ich weiß, dass dies POSIX-kompatibel ist.
Qbi
Eine andere Sache, die Sie beachten sollten, ist, dass [Ausdruck] wahr ist, wenn Ausdruck Null ergibt / zurückgibt, aber ((Ausdruck)) wahr ist, wenn Ausdruck Nicht Null ergibt / zurückgibt.
Joe