Aby wyszukać ciąg znaków z uwzględnieniem wielkości liter, wartość zmiennej needle
w wartości zmiennej haystack
:
case "$haystack" in
*"$needle"*) echo "present";
*) echo "absent";
esac
Aby wyszukać ciąg znaków bez rozróżniania wielkości liter, przekonwertuj oba na tę samą wielkość liter.
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
Zauważ, że tr
coreutils w GNU nie obsługują wielobajtowych ustawień regionalnych (np. UTF-8). Aby pracować z ustawieniami wielobajtowymi, użyj zamiast tego awk. Jeśli zamierzasz użyć awk, możesz sprawić, że porówna ciąg znaków, a nie tylko konwersję.
if awk 'BEGIN {exit !index(toupper(ARGV[2]), toupper(ARGV[1]))}' "$needle" "$haystack"; then
echo "present"
else
echo "absent"
fi
Funkcja tr
BusyBox nie obsługuje składni; możesz zamiast tego użyć . BusyBox nie obsługuje ustawień regionalnych innych niż ASCII.[:CLASS:]
tr a-z A-Z
W wersji bash (ale nie sh) w wersji 4.0+ istnieje wbudowana składnia do konwersji wielkości liter i prostsza składnia do dopasowywania ciągów.
if [[ "${haystack^^}" = *"${needle^^}"* ]]; then
echo "present"
else
echo "absent"
esac
grep -i
może?