Der ==
Operator wird verwendet, um zwei Zeichenfolgen im Shell-Skript zu vergleichen. Ich möchte jedoch zwei Zeichenfolgen vergleichen, wobei Groß- und Kleinschreibung ignoriert wird. Wie kann das gemacht werden? Gibt es dafür einen Standardbefehl?
string
shell
compare
case-insensitive
Sachin Chourasiya
quelle
quelle
if
Anweisungen vergleicht,shopt
müssen Sie bei diesem Ansatz die Doppelklammerform[[ ]]
der Bedingung anstelle der Einzelklammerform verwenden[ ]
. Siehe auch: gnu.org/software/bash/manual/html_node/The-Shopt-Builtin.html==
zum Vergleichen von zwei Zeichenfolgen verwendet wird. Die Antwort zeigt jedoch einen Vergleich ohne Berücksichtigung der Groß- und Kleinschreibungcase
Anweisung. Beruhigend, dasshopt
ermöglicht Lösung auch Groß- und Kleinschreibung Verwendung==
,=~
und andere String - Vergleichsoperator.shopt -u nocasematch
nach Abschluss des Vergleichs um zur Standardeinstellung von bash zurückzukehren.nocasematch
. Schnapp esSHELLNOCASEMATCH=`shopt -p nocasematch`
shopt -s nocasematch
$SHELLNOCASEMATCH
SHELLNOCASEMATCH=$(shopt -p nocasematch; true)
, weilshopt -p
mit Code 1 beendet wird, wenn die Option nicht gesetzt ist, und dies kann dazu führen, dass das Skript abgebrochen wird, wennset -e
es in Kraft ist.In Bash können Sie die Parametererweiterung verwenden, um eine Zeichenfolge in Groß- / Kleinbuchstaben zu ändern:
quelle
echo
Aussage führt zu:-bash: ${var1,,}: bad substitution
shopt -s nocasematch
es implementiert wird, aber normalerweise behandeln solche Lösungen auf "Sprachebene" es richtig.Alle diese Antworten ignorieren den einfachsten und schnellsten Weg, dies zu tun (solange Sie Bash 4 haben):
Alles, was Sie dort tun, ist, beide Zeichenfolgen in Kleinbuchstaben umzuwandeln und die Ergebnisse zu vergleichen.
quelle
Speichern Sie den Status von nocasematch (falls eine andere Funktion davon abhängt, dass sie deaktiviert ist):
Hinweis: Nur verwenden,
local
wenn es sich innerhalb einer Funktion befindet.quelle
case
Aussagen (einschließlich der in der Antwort von Ghostdog) meine Haut immer kriechen lassenEine Möglichkeit wäre, beide Zeichenfolgen in obere oder untere umzuwandeln:
Ein anderer Weg wäre, grep zu verwenden:
quelle
tr
Methode in meinen Docker-basierten Anwendungen verwendet, die auf Alpin basieren (wassh
via bietetbusybox
). Danke dir.Für die Korn-Shell verwende ich den integrierten Schriftsatzbefehl (-l für Kleinbuchstaben und -u für Großbuchstaben).
quelle
Sehr einfach, wenn Sie einen Zeilenvergleich ohne Berücksichtigung der Groß- und Kleinschreibung durchführen:
quelle
if fgrep -qix -- "$str1" <<<"$str2"; then
stattdessen zu verwenden .Hier ist meine Lösung mit tr:
quelle
grep
hat ein-i
Flag, das bedeutet, dass die Groß- und Kleinschreibung nicht berücksichtigt wird. Bitten Sie es, Ihnen mitzuteilen, ob var2 in var1 ist.quelle
Denn
zsh
die Syntax ist etwas anders, aber immer noch kürzer als die meisten Antworten hier:Dadurch werden beide Zeichenfolgen vor dem Vergleich in Großbuchstaben umgewandelt.
Bei einer anderen Methode werden zshs verwendet
globbing flags
, mit denen wir mithilfe desi
Glob-Flags direkt von der Übereinstimmung ohne Berücksichtigung der Groß- und Kleinschreibung profitieren können:quelle
shopt -s nocaseglob
quelle
Ich bin auf dieses großartige Blog / Tutorial / was auch immer über den Umgang mit Groß- und Kleinschreibung reagiert . Die folgenden drei Methoden werden anhand von Beispielen ausführlich erläutert:
1. Konvertieren Sie das Muster mit dem Befehl tr in Kleinbuchstaben
2. Verwenden Sie Regex mit Fallmustern
3. Schalten Sie nocasematch ein
quelle