Pour une recherche de chaîne sensible à la casse de la valeur de la variable needle
dans la valeur de la variable haystack
:
case "$haystack" in
*"$needle"*) echo "present";
*) echo "absent";
esac
Pour une recherche de chaîne insensible à la casse, convertissez les deux dans la même casse.
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
Notez que tr
dans GNU coreutils ne prend pas en charge les paramètres régionaux multi-octets (par exemple UTF-8). Pour faire fonctionner les locales multi-octets, utilisez plutôt awk. Si vous allez utiliser awk, vous pouvez lui faire faire la comparaison de chaînes et pas seulement la conversion.
if awk 'BEGIN {exit !index(toupper(ARGV[2]), toupper(ARGV[1]))}' "$needle" "$haystack"; then
echo "present"
else
echo "absent"
fi
Le tr
de BusyBox ne prend pas en charge la syntaxe; vous pouvez utiliser à la place. BusyBox ne prend pas en charge les paramètres régionaux non ASCII.[:CLASS:]
tr a-z A-Z
Dans bash (mais pas sh), la version 4.0+, il existe une syntaxe intégrée pour la conversion de casse et une syntaxe plus simple pour la correspondance des chaînes.
if [[ "${haystack^^}" = *"${needle^^}"* ]]; then
echo "present"
else
echo "absent"
esac
grep -i
peut être?