Для поиска строки с учетом регистра значения переменной 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
coreutils в GNU не поддерживает многобайтовые локали (например, UTF-8). Чтобы работать с многобайтовыми локалями, используйте вместо этого awk. Если вы собираетесь использовать awk, вы можете сделать сравнение строк, а не только преобразование.
if awk 'BEGIN {exit !index(toupper(ARGV[2]), toupper(ARGV[1]))}' "$needle" "$haystack"; then
echo "present"
else
echo "absent"
fi
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
может быть?