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?
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?
Antworten:
wenn du bash hast
str1="MATCH"
str2="match"
shopt -s nocasematch
case "$str1" in
$str2 ) echo "match";;
*) echo "no match";;
esac
Andernfalls sollten Sie uns mitteilen, welche Shell Sie verwenden.
alternativ mit awk
str1="MATCH"
str2="match"
awk -vs1="$str1" -vs2="$str2" 'BEGIN {
if ( tolower(s1) == tolower(s2) ){
print "match"
}
}'
==
zum Vergleichen von zwei Zeichenfolgen verwendet wird. Die Antwort zeigt jedoch einen Vergleich ohne Berücksichtigung der Groß- und Kleinschreibungcase
Anweisung. Beruhigend, das shopt
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 es SHELLNOCASEMATCH=`shopt -p nocasematch`
shopt -s nocasematch
$SHELLNOCASEMATCH
SHELLNOCASEMATCH=$(shopt -p nocasematch; true)
, weil shopt -p
mit Code 1 beendet wird, wenn die Option nicht gesetzt ist, und dies kann dazu führen, dass das Skript abgebrochen wird, wenn set -e
es in Kraft ist.
In Bash können Sie die Parametererweiterung verwenden, um eine Zeichenfolge in Groß- / Kleinbuchstaben zu ändern:
var1=TesT
var2=tEst
echo ${var1,,} ${var2,,}
echo ${var1^^} ${var2^^}
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):
if [ "${var1,,}" = "${var2,,}" ]; then
echo ":)"
fi
Alles, was Sie dort tun, ist, beide Zeichenfolgen in Kleinbuchstaben umzuwandeln und die Ergebnisse zu vergleichen.
Speichern Sie den Status von nocasematch (falls eine andere Funktion davon abhängt, dass sie deaktiviert ist):
local orig_nocasematch=$(shopt -p nocasematch)
shopt -s nocasematch
[[ "foo" == "Foo" ]] && echo "match" || echo "notmatch"
$orig_nocasematch
Hinweis: Nur verwenden, local
wenn es sich innerhalb einer Funktion befindet.
case
Aussagen (einschließlich der in der Antwort von Ghostdog) meine Haut immer kriechen lassen
Eine Möglichkeit wäre, beide Zeichenfolgen in obere oder untere umzuwandeln:
test $(echo "string" | /bin/tr '[:upper:]' '[:lower:]') = $(echo "String" | /bin/tr '[:upper:]' '[:lower:]') && echo same || echo different
Ein anderer Weg wäre, grep zu verwenden:
echo "string" | grep -qi '^String$' && echo same || echo different
tr
Methode in meinen Docker-basierten Anwendungen verwendet, die auf Alpin basieren (was sh
via bietet busybox
). Danke dir.
Für die Korn-Shell verwende ich den integrierten Schriftsatzbefehl (-l für Kleinbuchstaben und -u für Großbuchstaben).
var=True
typeset -l var
if [[ $var == "true" ]]; then
print "match"
fi
Sehr einfach, wenn Sie einen Zeilenvergleich ohne Berücksichtigung der Groß- und Kleinschreibung durchführen:
str1="MATCH"
str2="match"
if [[ $(fgrep -ix $str1 <<< $str2) ]]; then
echo "case-insensitive match";
fi
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.
var1=match
var2=MATCH
if echo $var1 | grep -i "^${var2}$" > /dev/null ; then
echo "MATCH"
fi
Denn zsh
die Syntax ist etwas anders, aber immer noch kürzer als die meisten Antworten hier:
> str1='mAtCh'
> str2='MaTcH'
> [[ "$str1:u" = "$str2:u" ]] && echo 'Strings Match!'
Strings Match!
>
Dadurch werden beide Zeichenfolgen vor dem Vergleich in Großbuchstaben umgewandelt.
Bei einer anderen Methode werden zshs verwendet globbing flags
, mit denen wir mithilfe des i
Glob-Flags direkt von der Übereinstimmung ohne Berücksichtigung der Groß- und Kleinschreibung profitieren können:
setopt extendedglob
[[ $str1 = (#i)$str2 ]] && echo "Match success"
[[ $str1 = (#i)match ]] && echo "Match success"
shopt -s nocaseglob
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
opt=$( tr '[:upper:]' '[:lower:]' <<<"$1" )
case $opt in
sql)
echo "Running mysql backup using mysqldump tool..."
;;
sync)
echo "Running backup using rsync tool..."
;;
tar)
echo "Running tape backup using tar tool..."
;;
*)
echo "Other options"
;;
esac
2. Verwenden Sie Regex mit Fallmustern
opt=$1
case $opt in
[Ss][Qq][Ll])
echo "Running mysql backup using mysqldump tool..."
;;
[Ss][Yy][Nn][Cc])
echo "Running backup using rsync tool..."
;;
[Tt][Aa][Rr])
echo "Running tape backup using tar tool..."
;;
*)
echo "Other option"
;;
esac
3. Schalten Sie nocasematch ein
opt=$1
shopt -s nocasematch
case $opt in
sql)
echo "Running mysql backup using mysqldump tool..."
;;
sync)
echo "Running backup using rsync tool..."
;;
tar)
echo "Running tape backup using tar tool..."
;;
*)
echo "Other option"
;;
esac
shopt -u nocasematch
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