Bei einer Zeichenfolgensuche, bei der die Groß- und Kleinschreibung beachtet wird, wird der Wert der Variablen needle
im Wert der Variablen wie folgt gesucht haystack
:
case "$haystack" in
*"$needle"*) echo "present";
*) echo "absent";
esac
Konvertieren Sie für eine Suche nach Zeichenfolgen, bei der die Groß- und Kleinschreibung nicht beachtet wird, beide in dieselbe Groß- / Kleinschreibung.
uc_needle=$(printf %s "$needle" | tr '[:lower:]' '[:upper:]' ; echo .); uc_needle=${uc_needle%.}
uc_haystack=$(printf %s "$haystack" | tr '[:lower:]' '[:upper:]' ; echo .); uc_haystack=${uc_haystack%.}
case "$uc_haystack" in
*"$uc_needle"*) echo "present";;
*) echo "absent";;
esac
Beachten Sie, dass die tr
in GNU Coreutils keine Multibyte-Locales unterstützen (zB UTF-8). Verwenden Sie stattdessen awk, um mit Multibyte-Gebietsschemas zu arbeiten. Wenn Sie awk verwenden, können Sie den Zeichenfolgenvergleich und nicht nur die Konvertierung durchführen.
if awk 'BEGIN {exit !index(toupper(ARGV[2]), toupper(ARGV[1]))}' "$needle" "$haystack"; then
echo "present"
else
echo "absent"
fi
Die tr
from BusyBox unterstützt die Syntax nicht. Sie können stattdessen verwenden. BusyBox unterstützt keine Nicht-ASCII-Sprachumgebungen.[:CLASS:]
tr a-z A-Z
In bash (aber nicht in sh) gibt es eine integrierte Syntax für die Konvertierung von Groß- und Kleinschreibung und eine einfachere Syntax für den String-Abgleich.
if [[ "${haystack^^}" = *"${needle^^}"* ]]; then
echo "present"
else
echo "absent"
esac
grep -i
vielleicht?