3491 Stimmen

Prüfen, ob eine Zeichenkette eine Teilzeichenkette in Bash enthält

Ich habe eine Zeichenfolge in Bash:

string="My string"

Wie kann ich prüfen, ob sie eine andere Zeichenfolge enthält?

if [ $string ?? 'foo' ]; then
  echo "It's there!"
fi

Wo ?? ist mein unbekannter Operator. Verwende ich echo y grep ?

if echo "$string" | grep 'foo'; then
  echo "It's there!"
fi

Das sieht ein bisschen unbeholfen aus.

4 Stimmen

Hallo, wenn leere Zeichenfolgen falsch sind, warum halten Sie es für ungeschickt? Es war der einzige Weg, der für mich funktionierte, trotz der vorgeschlagenen Lösungen.

1 Stimmen

Sie können die expr Befehl hier

9 Stimmen

Hier ist eine für Posix-Shells: stackoverflow.com/questions/2829613/

20voto

Wie wäre es damit:

text="   <tag>bmnmn</tag>  "
if [[ "$text" =~ "<tag>" ]]; then
   echo "matched"
else
   echo "not matched"
fi

2 Stimmen

\=~ ist für Regexp-Matching, also zu mächtig für den Zweck des OPs.

19voto

Die akzeptierte Antwort ist richtig, aber sie ist schwer zu lesen und zu verstehen.
Bei Problemen im Zusammenhang mit der Suche sollten Sie immer die $Nadel in einem $Heuhaufen Idiom.
Seit seinem vorgeschlagene Bearbeitungswarteschlange ist voll poste ich dies:

haystack='There are needles here.'
if [[ "$haystack" == *"needle"* ]]; then
    echo "It's there!"
fi

12voto

Jahid Punkte 19666
[[ $string == *foo* ]] && echo "It's there" || echo "Couldn't find"

0 Stimmen

Ich möchte hinzufügen, dass die echo "Couldn't find Anweisung am Ende ist ein netter Trick, um für diese übereinstimmenden Befehle den Exit-Status 0 zurückzugeben.

0 Stimmen

@nicodjimenez Sie können mit dieser Lösung nicht mehr auf den Exit-Status abzielen. Der Exit-Status wird von den Statusmeldungen verschluckt ...

1 Stimmen

Das ist genau das, was ich meinte... Wenn Sie nicht über || echo "Couldn't find" dann geben Sie einen Fehler-Exit-Status zurück, wenn es keine Übereinstimmung gibt, was Sie vielleicht nicht wollen, wenn Sie z.B. eine CI-Pipeline laufen lassen, bei der Sie wollen, dass alle Befehle einen Nicht-Fehler-Exit-Status zurückgeben

11voto

Yordan Georgiev Punkte 4516

Diese Stack Overflow-Antwort war die einzige, die Leerzeichen und Bindestriche abfing:

# For null cmd arguments checking   
to_check=' -t'
space_n_dash_chars=' -'
[[ $to_check == *"$space_n_dash_chars"* ]] && echo found

3 Stimmen

Es ist eine Antwort auf dieselbe Frage.

11voto

chemila Punkte 3985

Eine davon ist:

[ $(expr $mystring : ".*${search}.*") -ne 0 ] && echo 'yes' ||  echo 'no'

3 Stimmen

expr ist eines dieser Schweizer Armeemesser-Utilities, die in der Regel alles können, was man braucht, wenn man erst einmal herausgefunden hat, wie man es macht, aber wenn man es einmal implementiert hat, kann man sich nicht mehr erinnern, warum oder wie es tut, was es tut, also fasst man es nie wieder an und hofft, dass es nie aufhört zu tun, was es tut.

0 Stimmen

@AloisMahdal Ich habe nie heruntergevotet, ich stelle nur Vermutungen an, warum heruntergevotet wurde. Eine vorsichtige Bemerkung. Ich verwende expr in seltenen Fällen, wenn die Portabilität die Verwendung von bash (z.B. inkonsistentes Verhalten in älteren Versionen), tr (überall inkonsistent) oder sed (manchmal zu langsam) verhindert. Aus persönlicher Erfahrung kann ich jedoch sagen, dass beim erneuten Lesen dieser expr -ismen, muss ich noch einmal in der Manpage nachschlagen. Ich möchte also nur anmerken, dass jede Verwendung von expr kommentiert werden...

2 Stimmen

Es gab eine Zeit, in der man nur die ursprüngliche Bourne-Shell hatte. Ihr fehlten einige häufig benötigte Funktionen, so dass Werkzeuge wie expr y test implementiert wurden. Heutzutage gibt es in der Regel bessere Werkzeuge, von denen viele in jede moderne Shell integriert sind. Ich schätze test ist immer noch da, aber niemand scheint es zu vermissen. expr .

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