Các ==nhà điều hành được sử dụng để so sánh hai chuỗi trong shell script. Tuy nhiên, tôi muốn so sánh hai chuỗi bỏ qua trường hợp, làm thế nào nó có thể được thực hiện? Có bất kỳ lệnh tiêu chuẩn cho điều này?
Các ==nhà điều hành được sử dụng để so sánh hai chuỗi trong shell script. Tuy nhiên, tôi muốn so sánh hai chuỗi bỏ qua trường hợp, làm thế nào nó có thể được thực hiện? Có bất kỳ lệnh tiêu chuẩn cho điều này?
Câu trả lời:
nếu bạn có bash
str1="MATCH"
str2="match"
shopt -s nocasematch
case "$str1" in
$str2 ) echo "match";;
*) echo "no match";;
esac
nếu không, bạn nên cho chúng tôi biết bạn đang sử dụng loại vỏ nào.
thay thế, sử dụng awk
str1="MATCH"
str2="match"
awk -vs1="$str1" -vs2="$str2" 'BEGIN {
if ( tolower(s1) == tolower(s2) ){
print "match"
}
}'
==được sử dụng để so sánh hai chuỗi, nhưng câu trả lời thể hiện so sánh không phân biệt chữ hoa chữ thường bằng cách sử dụng một casecâu lệnh. Trấn an, các shoptgiải pháp cũng cho phép sử dụng case-insensitive của ==, =~và các nhà khai thác chuỗi so sánh khác.
shopt -u nocasematchsau khi so sánh được thực hiện để trở lại mặc định của bash.
nocasematchcài đặt. Lấy nó SHELLNOCASEMATCH=`shopt -p nocasematch`sau đó thay đổi nó shopt -s nocasematchvà sau khi thực hiện xong, khôi phục nó bằng$SHELLNOCASEMATCH
SHELLNOCASEMATCH=$(shopt -p nocasematch; true), vì shopt -psẽ thoát với mã 1 nếu tùy chọn không được đặt và điều này có thể khiến tập lệnh hủy bỏ nếu set -ecó hiệu lực.
Trong Bash, bạn có thể sử dụng mở rộng tham số để sửa đổi một chuỗi thành tất cả chữ thường / chữ hoa:
var1=TesT
var2=tEst
echo ${var1,,} ${var2,,}
echo ${var1^^} ${var2^^}
echocâu lệnh đầu tiên dẫn đến:-bash: ${var1,,}: bad substitution
shopt -s nocasematchtriển khai nhưng thông thường các giải pháp "cấp độ ngôn ngữ" đó xử lý chính xác.
Tất cả những câu trả lời này đều bỏ qua cách dễ nhất và nhanh nhất để làm điều này (miễn là bạn có Bash 4):
if [ "${var1,,}" = "${var2,,}" ]; then
echo ":)"
fi
Tất cả những gì bạn đang làm ở đó là chuyển đổi cả hai chuỗi thành chữ thường và so sánh kết quả.
Lưu trạng thái của nocasematch (trong trường hợp một số chức năng khác phụ thuộc vào chức năng này bị vô hiệu hóa):
local orig_nocasematch=$(shopt -p nocasematch)
shopt -s nocasematch
[[ "foo" == "Foo" ]] && echo "match" || echo "notmatch"
$orig_nocasematch
Lưu ý: chỉ sử dụng localnếu nó nằm trong hàm.
casephát biểu (bao gồm cả những câu trả lời của ghostdog) sẽ luôn khiến da tôi bò lên
Một cách sẽ là chuyển đổi cả hai chuỗi thành trên hoặc dưới:
test $(echo "string" | /bin/tr '[:upper:]' '[:lower:]') = $(echo "String" | /bin/tr '[:upper:]' '[:lower:]') && echo same || echo different
Một cách khác là sử dụng grep:
echo "string" | grep -qi '^String$' && echo same || echo different
trphương thức này trong các ứng dụng đóng băng của mình dựa trên alpine (cung cấp shthông qua busybox). Cảm ơn bạn.
Đối với shell korn, tôi sử dụng lệnh tích hợp sắp chữ (-l cho chữ thường và -u cho chữ hoa).
var=True
typeset -l var
if [[ $var == "true" ]]; then
print "match"
fi
grepcó một -icờ có nghĩa là trường hợp không nhạy cảm, vì vậy hãy yêu cầu nó cho bạn biết nếu var2 nằm trong var1.
var1=match
var2=MATCH
if echo $var1 | grep -i "^${var2}$" > /dev/null ; then
echo "MATCH"
fi
Đối với zshcú pháp hơi khác nhau, nhưng vẫn ngắn hơn hầu hết các câu trả lời ở đây:
> str1='mAtCh'
> str2='MaTcH'
> [[ "$str1:u" = "$str2:u" ]] && echo 'Strings Match!'
Strings Match!
>
Điều này sẽ chuyển đổi cả hai chuỗi thành chữ hoa trước khi so sánh.
Một phương pháp khác sử dụng zsh globbing flags, cho phép chúng tôi trực tiếp sử dụng kết hợp không phân biệt chữ hoa chữ thường bằng cách sử dụng icờ toàn cầu:
setopt extendedglob
[[ $str1 = (#i)$str2 ]] && echo "Match success"
[[ $str1 = (#i)match ]] && echo "Match success"
Tôi đã xem qua blog / hướng dẫn tuyệt vời này / bất cứ điều gì về việc xử lý mô hình phân biệt chữ hoa chữ thường . Ba phương pháp sau đây được giải thích chi tiết với các ví dụ:
1. Chuyển đổi mẫu thành chữ thường bằng lệnh tr
opt=$( tr '[:upper:]' '[:lower:]' <<<"$1" )
case $opt in
sql)
echo "Running mysql backup using mysqldump tool..."
;;
sync)
echo "Running backup using rsync tool..."
;;
tar)
echo "Running tape backup using tar tool..."
;;
*)
echo "Other options"
;;
esac
2. Sử dụng regex với các mẫu trường hợp
opt=$1
case $opt in
[Ss][Qq][Ll])
echo "Running mysql backup using mysqldump tool..."
;;
[Ss][Yy][Nn][Cc])
echo "Running backup using rsync tool..."
;;
[Tt][Aa][Rr])
echo "Running tape backup using tar tool..."
;;
*)
echo "Other option"
;;
esac
3. Bật nocasematch
opt=$1
shopt -s nocasematch
case $opt in
sql)
echo "Running mysql backup using mysqldump tool..."
;;
sync)
echo "Running backup using rsync tool..."
;;
tar)
echo "Running tape backup using tar tool..."
;;
*)
echo "Other option"
;;
esac
shopt -u nocasematch
ifcâu lệnh,shoptcách tiếp cận yêu cầu bạn sử dụng dạng hai khung[[ ]]có điều kiện thay vì dạng dấu ngoặc[ ]đơn. Xem thêm: gnu.org/software/bash/manual/html_node/The-Shopt-Builtin.html