it-swarm.com.de

Wie vergleiche ich zwei Stringvariablen in einer 'if'-Anweisung in Bash?

Ich versuche, eine if -Anweisung zum Arbeiten in Bash (mit bunt ) zu bekommen:

#!/bin/bash

s1="hi"
s2="hi"

if ["$s1" == "$s2"]
then
  echo match
fi

Ich habe verschiedene Formen der if -Anweisung mit [["$s1" == "$s2"]], mit und ohne Anführungszeichen, mit =, == und -eq ausprobiert, aber ich verstehe immer noch der folgende Fehler:

[hi: Befehl nicht gefunden

Ich habe mir verschiedene Sites und Tutorials angesehen und diese kopiert, aber es funktioniert nicht - was mache ich falsch?

Schließlich möchte ich sagen, ob $s1$s2 enthält. Wie kann ich das tun?

Ich habe gerade die Leerzeichen etwas herausgearbeitet ..:/Wie soll ich sagen enthält?

Ich habe es versucht

if [[ "$s1" == "*$s2*" ]]

aber es hat nicht funktioniert.

559
Mr Shoubs

Verwenden Sie zum Vergleichen von Zeichenfolgen Folgendes:

if [ "$s1" == "$s2" ]

Verwenden Sie für a enthält b:

if [[ $s1 == *"$s2"* ]]

(und achten Sie darauf, Leerzeichen zwischen den Symbolen einzufügen):

schlecht:

if ["$s1" == "$s2"]

gut:

if [ "$s1" == "$s2" ]
776
marcog

Sie brauchen Leerzeichen:

if [ "$s1" == "$s2" ]
153
unwind

Sie sollten darauf achten, ein Leerzeichen zwischen dem Zeichen "[" und doppelten Anführungszeichen zu lassen, wenn die Variable Folgendes enthält:

if [ "$s1" == "$s2" ]; then
#   ^     ^  ^     ^
   echo match
fi

Die ^s zeigen die Leerzeichen, die Sie verlassen müssen.

136
trejo08

Ich schlage folgendes vor:

if [ "$a" = "$b" ]

Beachten Sie den Leerraum zwischen den öffnenden/schließenden Klammern und den Variablen sowie die Leerzeichen, die das Zeichen '=' einschließen.

Achten Sie auch auf Ihren Skript-Header. Es ist nicht das Gleiche, ob Sie verwenden

#!/bin/bash

oder

#!/bin/sh

Hier ist die Quelle .

32

Ich würde vorschlagen:

#!/bin/bash

s1="hi"
s2="hi"

if [ $s1 = $s2 ]
then
  echo match
fi

Ohne die doppelten Anführungszeichen und mit nur einem gleich.

16
jzrk

Bash4 + Beispiele. Hinweis: Wenn Sie keine Anführungszeichen verwenden, treten Probleme auf, wenn Wörter Leerzeichen usw. enthalten. Zitieren Sie immer in bash IMO.

Hier einige Beispiele für BASH4 +:

Beispiel 1: Überprüfen Sie die Zeichenfolge auf "Ja" (ohne Berücksichtigung der Groß-/Kleinschreibung):

if [[ "${str,,}" == *"yes"* ]] ;then

Beispiel 2: Überprüfen Sie die Zeichenfolge auf "Ja" (ohne Berücksichtigung der Groß-/Kleinschreibung):

if [[ "$(echo "$str" | tr '[:upper:]' '[:lower:]')" == *"yes"* ]] ;then

Beispiel 3: Überprüfen Sie die Zeichenfolge auf "Ja" (Groß- und Kleinschreibung beachten):

 if [[ "${str}" == *"yes"* ]] ;then

Beispiel 4: Überprüfen Sie die Zeichenfolge auf "Ja" (Groß- und Kleinschreibung beachten):

 if [[ "${str}" =~ "yes" ]] ;then

Beispiel 5, genaue Übereinstimmung (Groß- und Kleinschreibung beachten):

 if [[ "${str}" == "yes" ]] ;then

Beispiel 6, genaue Übereinstimmung (Groß- und Kleinschreibung wird nicht berücksichtigt):

 if [[ "${str,,}" == "yes" ]] ;then

Beispiel 7, genaue Übereinstimmung:

 if [ "$a" = "$b" ] ;then
15
Mike Q

Diese Frage hat bereits gute Antworten, aber hier scheint es eine leichte Verwechslung zwischen der Verwendung von Einfachgleichheit und Doppelgleichheit zu geben

if [ "$s1" == "$s2" ]

Der Hauptunterschied liegt in der verwendeten Skriptsprache. Wenn Sie bash verwenden, fügen Sie #!/bin/bash in den Anfang des Skripts ein und speichern Sie Ihr Skript als filename.bash. Verwenden Sie zum Ausführen bash filename.bash - dann müssen Sie == verwenden.

Wenn Sie sh verwenden, verwenden Sie #!/bin/sh und speichern Sie Ihr Skript als filename.sh. Zum Ausführen verwenden Sie sh filename.sh - dann müssen Sie single = verwenden. Vermeiden Sie es, sie zu vermischen.

13
Rahul Dahiya
$ if [ "$s1" == "$s2" ]; then echo match; fi
match
$ test "s1" = "s2" ;echo match
match
$
9
qwerty

Ich habe momentan keinen Zugriff auf eine Linux-Box, aber [ist eigentlich ein Programm (und eine eingebaute Bash), also muss man zwischen [und dem ersten Parameter ein Leerzeichen setzen.

Beachten Sie auch, dass der String-Gleichheitsoperator ein einzelnes = zu sein scheint

7
Mrki

Das ist mehr Klarheit als Antwort! Ja, der Hinweis ist in der Fehlermeldung:

[hi: Befehl nicht gefunden

dies zeigt Ihnen, dass Ihr "hi" mit dem "[" verknüpft wurde.

Anders als in herkömmlichen Programmiersprachen ist "[" in Bash ein Befehl wie das offensichtlichere "ls" usw. - es wird nicht speziell behandelt, nur weil es ein Symbol ist, daher das "[" und das (ersetzte) "$ s1 msgstr "" "die in Ihrer Frage direkt nebeneinander stehen, werden verbunden (wie es für Bash richtig ist) und es wird dann versucht, einen Befehl in dieser Position zu finden: [hi - was Bash unbekannt ist.

In C und einigen anderen Sprachen würde das "[" als eine andere "Zeichenklasse" angesehen und von dem folgenden "hi" getrennt werden.

Daher benötigen Sie nach dem Öffnen ein Leerzeichen "[".

6
MikeW

Für eine Version mit reinem Bash und ohne test, aber wirklich hässlich, versuchen Sie:

if ( exit "${s1/*$s2*/0}" )2>/dev/null
then
   echo match
fi

Erläuterung: In ( ) wird eine zusätzliche Unterschale geöffnet. Es wird mit 0 beendet, wenn es eine Übereinstimmung gab, und es wird versucht, mit $ s1 zu beenden, wenn es keine Übereinstimmung gab, die einen Fehler auslöst (hässlich). Dieser Fehler ist an /dev/null gerichtet.

3
user2546460
#!/bin/bash

s1="hi"
s2="hi"

if [ "x$s1" == "x$s2" ]
then
  echo match
fi

Durch Hinzufügen einer zusätzlichen Zeichenfolge wird die Sicherheit erhöht.

Sie können auch eine andere Notation für einzeilige Befehle verwenden:

[ "x$s1" == "x$s2" ] && echo match
3
mpapis