Для строкового пошуку строкового пошуку значення змінної needle
у значенні змінної haystack
:
case "$haystack" in
*"$needle"*) echo "present";
*) echo "absent";
esac
Для пошуку нечутливих до регістру рядків конвертуйте обидва в той самий регістр.
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
Зауважте, що tr
в GNU coreutils не підтримує багатобайтові локалі (наприклад, UTF-8). Щоб зробити роботу з багатобайтовими локалями, використовуйте натомість awk. Якщо ви збираєтеся використовувати awk, ви можете змусити його робити порівняння рядків, а не лише перетворення.
if awk 'BEGIN {exit !index(toupper(ARGV[2]), toupper(ARGV[1]))}' "$needle" "$haystack"; then
echo "present"
else
echo "absent"
fi
The tr
від BusyBox не підтримує синтаксис; ви можете використовувати замість цього. BusyBox не підтримує не-ASCII-локалі.[:CLASS:]
tr a-z A-Z
У bash (але не sh), версія 4.0+, є вбудований синтаксис для перетворення випадків та більш простий синтаксис для узгодження рядків.
if [[ "${haystack^^}" = *"${needle^^}"* ]]; then
echo "present"
else
echo "absent"
esac
grep -i
можливо?