一个文件中可能有以下两种情况a.txt
::
情况1:
V1=last #case insensitive
V2=Last #case insensitive
案例2:
V1=last #case insensitive
V2=LastNum #case insensitive
我需要检查两者是否V1
在V2
任何给定时间都不相同。
V1
并且V2
也可以分配任何数字。
我正在使用下面的代码,但在第二种情况下失败:whenV1=last
和 V2=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