Groß-und Kleinschreibung-Vergleich in Bash
Ich bin versucht, zu schreiben, einen Vergleich in einer while-Anweisung, die die groß-und Kleinschreibung. Im Grunde bin ich einfach versuchen zu verkürzen, wird im folgenden zu handeln, um auf eine ja-oder-Nein-Frage Eingabeaufforderung für den Benutzer ...
while[ $yn == "y" | $yn == "Y" | $yn == "Yes" | $yn == "yes" ] ; do
Was wäre der beste Weg zu gehen über diese?
- betrachten Sie die Verwendung von regex, könnte kürzer sein
- möglich, Duplikat der groß-und Kleinschreibung Vergleich von strings in Shell-Skript
- Beachten Sie das fehlende Leerzeichen vor der öffnenden
[
.
Du musst angemeldet sein, um einen Kommentar abzugeben.
oder :
Hinweis
[[
ist ein bash-Schlüsselwort ähnlich (aber stärker als) die[
Befehl. Sehen http://mywiki.wooledge.org/BashFAQ/031 und http://mywiki.wooledge.org/BashGuide/TestsAndConditionalsEs sei denn, Sie schreiben für POSIX-sh, empfehlen wir
[[
.=~
Betreiber von[[
wertet die linke hand Schnur gegen die Rechte hand-extended regular expressions (ERE). Nach einem erfolgreichen matchBASH_REMATCH
verwendet werden können, zu erweitern, aufeinander abgestimmten Gruppen aus dem Muster. Zitiert Teile des regex geworden literal. Um sicher zu sein & - kompatibel ist, setzen Sie die regex in einer parameter-und tun[[ $string =~ $regex ]]
shopt -s nocasematch
weil meine sed-basiert finden und ersetzt auch groß-und Kleinschreibung?^..$
z.B.yn="noyesno"
while[[ $yn =~ (y|yes) ]]
schien Arbeit perfekt.[[ $yn =~ y(es)? ]]
; die parens in(y|yes)
nicht unbedingt benötigt werden, durch die Art und Weise.Nicht zu benutzen brauchen shopt oder regex. Der einfachste und Schnellste Weg, dies zu tun (solange Sie Bash 4):
Alles, was Sie tun, es ist die Konvertierung von beiden strings zu Kleinbuchstaben und vergleicht die Ergebnisse.
${my_variable,,}
syntax ist bash parameter expansion. Siehe gnu.org/software/bash/manual/... und nach unten scrollen, zu dem Abschnitt für den Fall Konvertierungen.Hier eine Antwort, die verwendet erweiterte Muster statt der regulären Ausdrücke:
Beachten Sie, dass ab version 4.1
bash
immer verwendet erweiterte Muster innerhalb der[[ ... ]]
bedingten Ausdruck, so dieshopt
Linie ist nicht notwendig.y
Spiele selbst;?(es)
entspricht null oder einem vorkommen des Musterses
.versuchen, diese zu:
yn=YES
wird schlägty
ist der groß-und Kleinschreibung,es
Teil ist nur Kleinschreibung... das, was ich verstanden.., make the value all in lower/upper case. then you could save some effort. You could just compare if it equals
y` oderyes
(wenn in Kleinbuchstaben)yn=${yn,,}; [[ $yn =~ ^yes ]]
[[ ]]
, ohne Anführungszeichen.Ich lieber mit
grep -E
oderegrep
kurz:Hier haben Sie die Erklärungen aus
grep
Handbuch: