匹配 if 条件中不区分大小写的模式

匹配 if 条件中不区分大小写的模式

一个文件中可能有以下两种情况a.txt::

情况1:

V1=last  #case insensitive
V2=Last  #case insensitive

案例2:

V1=last     #case insensitive
V2=LastNum  #case insensitive

我需要检查两者是否V1V2任何给定时间都不相同。 V1并且V2也可以分配任何数字。

我正在使用下面的代码,但在第二种情况下失败:whenV1=lastV2=LastNum。情况 2 的预期输出是:Not Same

if [[ ( "${V1}" =~ [Ll][Aa][Ss][Tt] && "${V2}" =~ [Ll][Aa][Ss][Tt]$ ) || ( "${V1}" == "${V2}" ) ]];then
  echo "V1 and V2 are same"
else
  echo "Not Same"
fi

非常欢迎任何帮助!提前致谢!

答案1

如果您使用的是 Bash,则可以使用扩展${var,,}$var变成小写:

V1=foO V2=Foo
if [[ "${V1,,}" == "${V2,,}" ]]; then
    printf '%s\n' "'$V1' and '$V2' are the same in lowercase";
fi

或使用nocasematch

shopt -s nocasematch
V1=foO V2=Foo
if [[ "$V1" == "$V2" ]]; then
    printf '%s\n' "'$V1' and '$V2' are the same apart from case" ;
fi

虽然我不确定其中任何一个是否适用于 ASCII 字母之外的其他字符。一般来说,大写/小写比较和不区分大小写的匹配问题有点棘手,而且还依赖于语言环境(土耳其语有点和无点的我就是通常的例子)。但是,如果您拥有的只是没有变音符号的字母 A 到 Z,以及与英语兼容的语言环境或 set LC_ALL=C,那么应该可以工作。


在 Zsh 中,extendedglob启用该选项后,您可以(#i)$V2在右侧使用:

setopt extendedglob
V1=foO V2=Foo
if [[ "$V1" == (#i)"$V2" ]]; then
    printf '%s\n' "'$V1' and '$V2' are the same apart from case" ;
fi

相关内容