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 case
câu lệnh. Trấn an, các shopt
giả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 nocasematch
sau khi so sánh được thực hiện để trở lại mặc định của bash.
nocasematch
cài đặt. Lấy nó SHELLNOCASEMATCH=`shopt -p nocasematch`
sau đó thay đổi nó shopt -s nocasematch
và sau khi thực hiện xong, khôi phục nó bằng$SHELLNOCASEMATCH
SHELLNOCASEMATCH=$(shopt -p nocasematch; true)
, vì shopt -p
sẽ 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 -e
có 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^^}
echo
câu lệnh đầu tiên dẫn đến:-bash: ${var1,,}: bad substitution
shopt -s nocasematch
triể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 local
nếu nó nằm trong hàm.
case
phá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
tr
phươ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 sh
thô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
grep
có một -i
cờ 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 zsh
cú 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 i
cờ 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
if
câu lệnh,shopt
cá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