Para uma pesquisa de cadeia que diferencia maiúsculas de minúsculas do valor da variável needle
no valor da variável haystack
:
case "$haystack" in
*"$needle"*) echo "present";
*) echo "absent";
esac
Para uma pesquisa de cadeias sem distinção entre maiúsculas e minúsculas, converta ambas para o mesmo caso.
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
Observe que o tr
coreutils no GNU não suporta localidades multibyte (por exemplo, UTF-8). Para trabalhar com códigos de idioma multibyte, use o awk. Se você usar o awk, poderá fazer a comparação de cadeias e não apenas a conversão.
if awk 'BEGIN {exit !index(toupper(ARGV[2]), toupper(ARGV[1]))}' "$needle" "$haystack"; then
echo "present"
else
echo "absent"
fi
O tr
BusyBox não suporta a sintaxe; você pode usar em seu lugar. O BusyBox não suporta localidades não ASCII.[:CLASS:]
tr a-z A-Z
No bash (mas não sh), versão 4.0+, há uma sintaxe interna para conversão de maiúsculas e minúsculas e uma sintaxe mais simples para correspondência de cadeias.
if [[ "${haystack^^}" = *"${needle^^}"* ]]; then
echo "present"
else
echo "absent"
esac
grep -i
talvez?