Wenn dies beispielsweise mein Skript ist:
if [[ $yesno == "What's going on" ]]; then
Wie kann ich dann beispielsweise '
, ?
, ,
und ignorieren ?.
Im Grunde genommen scheinen also Whats going on
, What's going on
, What's going on?
und What's going on.
alle dasselbe zu sein. Ich weiß, dass ich || [[ $yesno == ".. ]]
mehrere Variablen eingeben kann, aber ich kann nicht jede einzelne Kombination eingeben.
Antwort1
Wenn Sie nur möchten, dass Ihre spezifischen Beispiele funktionieren, können Sie eine Bash-Regexp-Übereinstimmung verwenden
[[ $yesno =~ What\'?s\ going\ on[.?]? ]]
wobei wir das Anführungszeichen und die Leerzeichen mit einem Backslash maskieren.
Antwort2
Sie können vor dem Vergleich einfach alle Zeichen außer alphanumerischen in Ihrer Variable entfernen:
$ yesno="What's going on?"
$ if [[ ${yesno//[^a-zA-Z0-9\ ]/} == "Whats going on" ]]; then echo "OK";fi
OK
Antwort3
Eine der gebräuchlichsten und universellsten Möglichkeiten hierfür wäre, den String in zu leiten grep
und grep
den Rückgabecode zu überprüfen. Die if
Anweisung kann den Exitcode jedes Befehls oder jeder Pipeline überprüfen:
if echo "$yesno" | grep -q "What'*s *going *on[?.]*"; then
Dies erlaubt neben den von dir genannten Zeichen auch 0 oder mehr Leerzeichen zwischen Wörtern.
Diese Konstruktion sollte unter OS X, FreeBSD, GNU/Linux und allen anderen Systemen funktionieren, die POSIX grep bereitstellen: