Lesen Sie, dass zum Vergleichen der Zeichenfolgen if
doppelte eckige Klammern verwendet werden müssen. In einigen Büchern heißt es, dass der Vergleich durch erfolgen kann =
. Aber es funktioniert auch mit ==
.
#!/bin/bash
a="hello"
b="world"
if [[ $a == $b ]];then
echo "equal"
fi
Gibt es einen Unterschied zwischen =
und ==
im Vergleich?
bash
shell-script
user3539
quelle
quelle
=
ist für[
.==
ist für[[
.==
, weshalb Sie=
(Gleichheit) mit[
und==
(Mustervergleich, mit Semantik, die zitierfähig ist) mit verwenden sollten[[
. Siehehelp test
vshelp [[
.[ foo == foo ] && echo foo
Sicherheit gedruckt wirdfoo
und anzeigt, dass er mit==
funktioniert[
. Wenn jedoch mit "ist für" gemeint ist, dass "mit" verwendet werden sollte, dann habe ich weniger Einwände.Antworten:
[[ $a == $b ]]
ist kein Vergleich, es ist Mustervergleich. Sie benötigen[[ $a == "$b" ]]
für den Vergleich der Byte-zu-Byte-Gleichheit.=
ist dasselbe wie==
in jeder anderen Shell, die unterstützt[[...]]
(eingeführt vonksh
).[[...]]
ist keine Standardsyntaxsh
. Der[
Befehl ist Standard, und der Standard - Vergleich Operator ist=
(obwohl einige[
Implementierungen auch erkennen==
).Wie in jedem Argument eines Befehls müssen Variablen in Anführungszeichen gesetzt werden.
Standardmäßig
sh
erfolgt der Musterabgleich mitcase
:Der Vollständigkeit halber andere gleichheitsähnliche Operatoren, auf die Sie in Shell-Skripten stoßen können:
[ "$a" -eq "$b" ]
: Standardoperator[
zum Vergleichen von Dezimalzahlen. Einige[
Implementierungen erlauben Leerzeichen um die Zahlen, andere erlauben beliebige arithmetische Ausdrücke, aber das ist nicht portierbar. Portabel kann man[ "$((a))" -eq "$((b))" ]
dafür verwenden. Siehe auch[ "$((a == b))" -ne 0 ]
die die Standard - äquivalent wäre (außer , dass POSIXly wird das Verhalten nur dann angegeben , wenn$a
und$b
enthält ganzzahlige Konstanten) von:((a == b))
, from ksh und auch gefunden inzsh
undbash
, gibt true zurück, wenn die Auswertung des in gespeicherten arithmetischen Ausdrucks$a
dieselbe Zahl ergibt wie die von$b
. In der Regel wird dies zum Vergleichen von Zahlen verwendet. Beachten Sie, dass es zwischen den Shells Unterschiede gibt, wie arithmetische Ausdrücke ausgewertet werden und welche Zahlen unterstützt werden (z. B. unterstützen bash und einige Implementierungen / Versionen von ksh keine Gleitkommazahlen oder behandeln Zahlen mit führenden Nullen als Oktal).expr "$a" = "$b"
führt einen Zahlenvergleich durch, wenn beide Operanden als dezimale Ganzzahlen erkannt werden (einige erlauben Leerzeichen um die Zahl), und überprüft andernfalls, ob die beiden Zeichenfolgenoperatoren dieselbe Sortierreihenfolge haben. Es wäre auch für Werte von fehlschlagen$a
oder$b
, dieexpr
Operatoren wie(
,substr
...awk 'BEGIN{exit !(ARGV[1] == ARGV[2])}' "$a" "$b"
: Wenn$a
und$b
als Zahlen erkannt werden (mindestens dezimale Ganzzahl- und Gleitkommazahlen wie 1,2, -1,5e-4, führende nachgestellte Leerzeichen werden ignoriert, einige erkennen auch hexadezimal, oktal oder irgendetwas, was von erkannt wirdstrtod()
), wird ein numerischer Vergleich durchgeführt. Ansonsten je nach Implementierung, dann ist es entweder ein Byte-zu-Byte - String - Vergleich oder dergleichen fürexpr
einenstrcoll()
Vergleich, dh ob$a
und$b
Art gleich.Siehe auch:
quelle
Dies sind äquivalente in Bash:
Die ersten beiden Variablen $ x müssen nicht in Anführungszeichen gesetzt werden. Bash führt die Worttrennung und Pfadnamenerweiterung innerhalb von [aber nicht innerhalb von [[durch:
[[ $x = "$y" ]]
ist ein Zeichenkettenvergleich, aber[[ $x = $y ]]
ein Mustervergleichsausdruck:-eq soll nur mit ganzen Zahlen verwendet werden:
Siehe auch BashFAQ / 031: Was ist der Unterschied zwischen test, [und [[? .
quelle