it-swarm.com.de

So vergleichen Sie Zeichenfolgen in Bash

Wie vergleiche ich eine Variable mit einer Zeichenfolge (und tue etwas, wenn sie übereinstimmt)?

863
Erik Sapir

Variablen in if-Anweisungen verwenden

if [ "$x" = "valid" ]; then
  echo "x has the value 'valid'"
fi

Wenn Sie etwas tun möchten, das nicht übereinstimmt, ersetzen Sie = durch !=. Weitere Informationen zu Zeichenfolgenoperationen und Rechenoperationen finden Sie in der jeweiligen Dokumentation.

Warum setzen wir $x in Anführungszeichen?

Sie möchten die Anführungszeichen um $x setzen, da bei einem leeren Bash-Skript ein Syntaxfehler auftritt (siehe unten):

if [ = "valid" ]; then

Nicht standardmäßige Verwendung des Operators ==

Beachten Sie, dass bash die Verwendung von == für die Gleichheit mit [ ermöglicht, aber dies ist kein Standard .

Verwenden Sie entweder den ersten Fall, in dem die Anführungszeichen um $x optional sind:

if [[ "$x" == "valid" ]]; then

oder benutze den zweiten Fall:

if [ "$x" = "valid" ]; then
1241
John Feminella

Oder, wenn Sie keine else-Klausel benötigen:

[ "$x" == "valid" ] && echo "x has the value 'valid'"
131
Marko
a="abc"
b="def"

# Equality Comparison
if [ "$a" == "$b" ]; then
    echo "Strings match"
else
    echo "Strings don't match"
fi

# Lexicographic (greater than, less than) comparison.
if [ "$a" \< "$b" ]; then
    echo "$a is lexicographically smaller then $b"
Elif [ "$a" \> "$b" ]; then
    echo "$b is lexicographically smaller than $a"
else
    echo "Strings are equal"
fi

Anmerkungen:

  1. Abstände zwischen if und [ und ] sind wichtig
  2. > und < sind Umleitungsoperatoren, also schließen Sie sie mit \> und \< für Zeichenfolgen.
69
Guru

Zum Vergleichen von Zeichenfolgen mit Platzhaltern verwenden Sie

if [[ "$stringA" == *$stringB* ]]; then
  # Do something here
else
  # Do Something here
fi
59

Ich muss einem der Kommentare in einem Punkt widersprechen:

[ "$x" == "valid" ] && echo "valid" || echo "invalid"

Nein, das ist kein verrückter Oneliner

Es sieht nur so aus, als würde man, hmm, den Uneingeweihten ...

In gewisser Weise werden gemeinsame Muster als Sprache verwendet.

Und nachdem Sie die Sprache gelernt haben.

Eigentlich ist es schön zu lesen

Es ist ein einfacher logischer Ausdruck, mit einem besonderen Teil: der faulen Auswertung der logischen Operatoren.

[ "$x" == "valid" ] && echo "valid" || echo "invalid"

Jeder Teil ist ein logischer Ausdruck; die erste kann wahr oder falsch sein, die anderen beiden sind immer wahr.

(
[ "$x" == "valid" ] 
&&
echo "valid"
)
||
echo "invalid"

Wenn es ausgewertet wird, wird das erste geprüft. Wenn es falsch ist, dann ist der zweite Operand der Logik und && nicht relevant. Das erste ist nicht wahr, also kann es sowieso nicht das erste und das zweite sein.
Nun, in diesem Fall ist die erste Seite der Logik oder || false , aber es könnte wahr sein, wenn die andere Seite - der dritte Teil - wahr ist.

Also wird der dritte Teil bewertet - hauptsächlich das Schreiben der Nachricht als Nebeneffekt. (Es hat das Ergebnis 0 für true, das wir hier nicht verwenden)

Die anderen Fälle sind ähnlich, aber einfacher - und - ich verspreche es! sind - können - einfach zu lesen!
(Ich habe keine, aber ich denke, ein UNIX-Veteran mit grauem Bart zu sein, hilft dabei sehr.)

33
Volker Siegel

sie können auch use case/esac verwenden

case "$string" in
 "$pattern" ) echo "found";;
esac
20
ghostdog74

das folgende Skript liest zeilenweise aus einer Datei mit dem Namen "testonthis" und vergleicht dann jede Zeile mit einer einfachen Zeichenfolge, einer Zeichenfolge mit Sonderzeichen und einem regulären Ausdruck. Wenn diese nicht übereinstimmt, gibt das Skript die Zeile aus, ohne sie auszugeben.

platz in der Bash ist so wichtig. also wird folgendes funktionieren

[ "$LINE" != "table_name" ] 

aber folgende werden nicht:

["$LINE" != "table_name"] 

also bitte verwenden wie es ist:

cat testonthis | while read LINE
do
if [ "$LINE" != "table_name" ] && [ "$LINE" != "--------------------------------" ] && [[ "$LINE" =~ [^[:space:]] ]] && [[ "$LINE" != SQL* ]]; then
echo $LINE
fi
done
14
Harshil

Ich würde wahrscheinlich reguläre Ausdrücke verwenden, wenn die Eingabe nur wenige gültige Einträge enthält. Z.B. Nur "Start" und "Stopp" sind gültige Aktionen.

if [[ "${ACTION,,}" =~ ^(start|stop)$ ]]; then
  echo "valid action"
fi

Beachten Sie, dass ich die Variable $ACTION mit dem Doppelkomma in Kleinbuchstaben schreibe. Beachten Sie auch, dass dies bei älteren Bash-Versionen nicht funktioniert.

11
steviethecat

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

genießen.

8
Mike Q

Ich habe es so gemacht, dass es mit bash, dash (sh) kompatibel ist:

testOutput="my test"
pattern="my"

case $testOutput in (*"$pattern"*)
    echo "if there is a match"
    exit 1
    ;;
(*)
   ! echo there is no coincidence!
;;esac
1
shades3002