Answers:
如果你有重击
str1="MATCH"
str2="match"
shopt -s nocasematch
case "$str1" in
$str2 ) echo "match";;
*) echo "no match";;
esac
否则,您应该告诉我们您使用的是什么shell。
或者,使用awk
str1="MATCH"
str2="match"
awk -vs1="$str1" -vs2="$str2" 'BEGIN {
if ( tolower(s1) == tolower(s2) ){
print "match"
}
}'
==
用于比较两个字符串,但响应使用一条case
语句演示了不区分大小写的比较。令人欣慰的是,该shopt
解决方案还使得能够不区分大小写的使用==
,=~
和其它字符串比较操作符。
shopt -u nocasematch
比较完成后执行以恢复回bash的默认值可能是明智的。
nocasematch
设置。抓住它,SHELLNOCASEMATCH=`shopt -p nocasematch`
然后进行更改shopt -s nocasematch
,一旦完成,请使用$SHELLNOCASEMATCH
SHELLNOCASEMATCH=$(shopt -p nocasematch; true)
,因为shopt -p
如果未设置该选项,则会以代码1退出,如果有效,这可能导致脚本中止set -e
。
在Bash中,您可以使用参数扩展将字符串修改为全部小写/大写:
var1=TesT
var2=tEst
echo ${var1,,} ${var2,,}
echo ${var1^^} ${var2^^}
echo
语句导致:-bash: ${var1,,}: bad substitution
shopt -s nocasematch
实现,但通常这种“语言级”解决方案可以正确处理它。
所有这些答案都忽略了最简单,最快的方法(只要您有Bash 4):
if [ "${var1,,}" = "${var2,,}" ]; then
echo ":)"
fi
您要做的就是将两个字符串都转换为小写并比较结果。
保存nocasematch的状态(以防其他功能取决于它的禁用状态):
local orig_nocasematch=$(shopt -p nocasematch)
shopt -s nocasematch
[[ "foo" == "Foo" ]] && echo "match" || echo "notmatch"
$orig_nocasematch
注意:仅local
在函数内部时使用。
case
陈述(包括在ghostdog回答中的陈述)将始终使我的皮肤爬行
一种方法是将两个字符串都转换为大写或小写:
test $(echo "string" | /bin/tr '[:upper:]' '[:lower:]') = $(echo "String" | /bin/tr '[:upper:]' '[:lower:]') && echo same || echo different
另一种方法是使用grep:
echo "string" | grep -qi '^String$' && echo same || echo different
tr
在我的搬运工-源化的应用程序基于高山(其提供方法sh
通过busybox
)。谢谢。
由于zsh
语法略有不同,但仍比此处的大多数答案短:
> str1='mAtCh'
> str2='MaTcH'
> [[ "$str1:u" = "$str2:u" ]] && echo 'Strings Match!'
Strings Match!
>
比较之前,这会将两个字符串都转换为大写。
另一种方法使用zsh's globbing flags
,它允许我们通过使用i
glob标志直接使用不区分大小写的匹配:
setopt extendedglob
[[ $str1 = (#i)$str2 ]] && echo "Match success"
[[ $str1 = (#i)match ]] && echo "Match success"
shopt -s nocaseglob
我遇到了这个很棒的博客/教程/有关区分大小写模式的任何内容。通过示例详细解释以下三种方法:
1.使用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.将正则表达式与案例模式一起使用
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.开启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
语句比较字符串的任何人,该shopt
方法都要求您使用条件的双括号[[ ]]
形式而不是单括号[ ]
形式。另请参见: gnu.org/software/bash/manual/html_node/The-Shopt-Builtin.html