Untuk pencarian string case-sensitive dari nilai variabel needle
dalam nilai variabel haystack
:
case "$haystack" in
*"$needle"*) echo "present";
*) echo "absent";
esac
Untuk pencarian string yang tidak memiliki case-case, konversikan keduanya menjadi case yang sama.
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
Perhatikan bahwa tr
dalam coreutils GNU tidak mendukung lokal multibyte (misalnya UTF-8). Untuk bekerja dengan multibyte lokal, gunakan awk sebagai gantinya. Jika Anda akan menggunakan awk, Anda dapat membuatnya melakukan perbandingan string dan bukan hanya konversi.
if awk 'BEGIN {exit !index(toupper(ARGV[2]), toupper(ARGV[1]))}' "$needle" "$haystack"; then
echo "present"
else
echo "absent"
fi
The tr
dari BusyBox tidak mendukung sintaks; Anda bisa menggunakannya . BusyBox tidak mendukung lokal non-ASCII.[:CLASS:]
tr a-z A-Z
Di bash (tetapi bukan sh), versi 4.0+, ada sintaks bawaan untuk konversi kasus, dan sintaksis lebih sederhana untuk pencocokan string.
if [[ "${haystack^^}" = *"${needle^^}"* ]]; then
echo "present"
else
echo "absent"
esac
grep -i
mungkin?