Per una ricerca stringa sensibile al maiuscolo / minuscolo del valore della variabile needle
nel valore della variabile haystack
:
case "$haystack" in
*"$needle"*) echo "present";
*) echo "absent";
esac
Per una ricerca di stringhe senza distinzione tra maiuscole e minuscole, converti entrambi nello stesso 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
Nota che i tr
coreutils in GNU non supportano le localizzazioni multibyte (es. UTF-8). Per lavorare con le versioni locali multibyte, usa invece awk. Se hai intenzione di usare awk, puoi farlo fare il confronto delle stringhe e non solo la conversione.
if awk 'BEGIN {exit !index(toupper(ARGV[2]), toupper(ARGV[1]))}' "$needle" "$haystack"; then
echo "present"
else
echo "absent"
fi
Il tr
da BusyBox non supporta la sintassi; puoi usare invece. BusyBox non supporta impostazioni locali non ASCII.[:CLASS:]
tr a-z A-Z
In bash (ma non sh), versione 4.0+, esiste una sintassi integrata per la conversione dei casi e una sintassi più semplice per la corrispondenza delle stringhe.
if [[ "${haystack^^}" = *"${needle^^}"* ]]; then
echo "present"
else
echo "absent"
esac
grep -i
può essere?