Đối với tìm kiếm chuỗi phân biệt chữ hoa chữ thường của giá trị của biến needle
trong giá trị của biến haystack
:
case "$haystack" in
*"$needle"*) echo "present";
*) echo "absent";
esac
Đối với tìm kiếm chuỗi không phân biệt chữ hoa chữ thường, chuyển đổi cả hai sang cùng một trường hợp.
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
Lưu ý rằng các tr
lõi trong GNU không hỗ trợ các địa điểm đa bào (ví dụ UTF-8). Để thực hiện công việc với các địa phương multibyte, sử dụng awk thay thế. Nếu bạn sẽ sử dụng awk, bạn có thể làm cho nó thực hiện so sánh chuỗi chứ không chỉ là chuyển đổi.
if awk 'BEGIN {exit !index(toupper(ARGV[2]), toupper(ARGV[1]))}' "$needle" "$haystack"; then
echo "present"
else
echo "absent"
fi
Các tr
từ BusyBox không hỗ trợ cú pháp; bạn có thể sử dụng thay thế. BusyBox không hỗ trợ các ngôn ngữ không phải ASCII.[:CLASS:]
tr a-z A-Z
Trong bash (nhưng không phải sh), phiên bản 4.0+, có một cú pháp tích hợp để chuyển đổi trường hợp và một cú pháp đơn giản hơn để khớp chuỗi.
if [[ "${haystack^^}" = *"${needle^^}"* ]]; then
echo "present"
else
echo "absent"
esac
grep -i
có lẽ?