在shell脚本中进行字符串大小写不敏感的比较

209

==操作符用于在Shell脚本中比较两个字符串。然而,我希望比较两个字符串时忽略大小写,怎么办?有没有标准命令可以做到这一点?

可以使用strcasecmp函数来比较两个字符串而忽略大小写。以下是使用该函数的示例:

if [ strcasecmp "$str1" "$str2" -eq 0 ]
then
    echo "Strings are equal ignoring case"
else
    echo "Strings are not equal ignoring case"
fi

要注意的是,此函数只能在Bash shell和Korn shell中使用。


4
快速提示:在shell中,==不是标准的字符串比较运算符;唯一POSIX标准化的比较运算符是= - Charles Duffy
14个回答

4

grep 带有一个 -i 标志,表示不区分大小写,因此请让它告诉您 var2 是否在 var1 中。

var1=match 
var2=MATCH 
if echo $var1 | grep -i "^${var2}$" > /dev/null ; then
    echo "MATCH"
fi

3
如果var2中包含任何正则表达式特殊字符,它将无法工作。 - haridsv

0

'tr'实用程序(翻译字符)始终存在于所有Unix/Linux机器上,并且是轻量级的。

这里有一个函数,可以用来解决大小写不敏感的比较问题。由于'tr'的确切位置可能会有所变化,因此我们首先探测其可能的位置,并将正确的位置存储在一个名为“BIN_TR”的环境变量中。

declare BIN_TR=$( ls /bin/tr /usr/bin/tr 2>/dev/null | head -1 );

这个然后被用在函数声明中。

toLowerCase() {
  echo "$*" | $BIN_TR '[:upper:]' '[:lower:]'
}

预计使用'tr'的解决方案可以在不同操作系统和系统设置之间高度移植。虽然'awk'也很可能,但与'awk'相比,'tr'实用程序要小得多,因此使用'tr'的函数可能更轻量级。

你为什么要这样使用 ... | $BIN_TR 而不是直接使用 ... | tr 呢?因为 shell 本身会自动进行 PATH 查找并缓存该查找结果,而其内置的查找方式比使用 ls 的 hack 更加高效。 - Charles Duffy
此外,一些发行版根本不使用 /bin/usr/bin。我正在 NixOS 机器上编写这篇文章;我的 tr 副本来自 /run/current-system/sw/bin/tr,它是一个符号链接到 /nix/store/cc4nnlspm4pwmp5rvjl6wpy9nyzcsbnr-coreutils-8.31/bin/tr - Charles Duffy

0

shopt -s nocaseglob


-2
在类Unix操作系统上,test命令检查文件类型并比较值。
str1="MATCH"
str2="match"

if test $str1 =  $str2
  then
  echo "equal yes"
else
  echo "equal not"
fi

在类Unix操作系统中,test命令检查文件类型并比较值。
这种方式非常简单。
只需几行代码。

1
应该是 test "$str1" = "$str2" -- 引号对于可靠的正确操作来说不是可选的。 - Charles Duffy
测试有一个很好的别名。如果你写if [ $str1 = $str2 ];是严格相同的。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接