176

==运算符用于比较 shell 脚本中的两个字符串。但是,我想比较两个字符串忽略大小写,怎么办?有什么标准的命令吗?

4

14 回答 14

203

在 Bash 中,您可以使用参数扩展将字符串修改为全部小写/大写:

var1=TesT
var2=tEst

echo ${var1,,} ${var2,,}
echo ${var1^^} ${var2^^}
于 2013-10-16T19:20:29.717 回答
160

所有这些答案都忽略了最简单和最快的方法(只要你有 Bash 4):

if [ "${var1,,}" = "${var2,,}" ]; then
  echo ":)"
fi

您所做的只是将两个字符串都转换为小写并比较结果。

于 2014-12-28T19:13:42.557 回答
87

如果你有 bash

str1="MATCH"
str2="match"
shopt -s nocasematch
case "$str1" in
 $str2 ) echo "match";;
 *) echo "no match";;
esac

否则,您应该告诉我们您使用的是什么外壳。

替代方法,使用 awk

str1="MATCH"
str2="match"
awk -vs1="$str1" -vs2="$str2" 'BEGIN {
  if ( tolower(s1) == tolower(s2) ){
    print "match"
  }
}'
于 2009-11-13T12:02:47.617 回答
45

保存状态nocasematch(以防某些其他功能取决于它被禁用):

local orig_nocasematch=$(shopt -p nocasematch; true)
shopt -s nocasematch

[[ "foo" == "Foo" ]] && echo "match" || echo "notmatch"

$orig_nocasematch

请注意local仅在函数内部才需要。
此外,该部件将阻止外壳在打开和失败; true时退出(因为根本没有设置 nocasematch)。set -e$(shopt -p nocasematch)

于 2013-01-03T11:45:50.500 回答
21

一种方法是将两个字符串都转换为大写或小写:

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
于 2009-11-13T11:52:35.140 回答
7

对于 korn shell,我使用 typeset 内置命令(-l 表示小写,-u 表示大写)。

var=True
typeset -l var
if [[ $var == "true" ]]; then
    print "match"
fi
于 2013-09-26T22:17:10.903 回答
6

如果您 fgrep 进行不区分大小写的行比较,则非常容易:

str1="MATCH"
str2="match"

if [[ $(fgrep -ix $str1 <<< $str2) ]]; then
    echo "case-insensitive match";
fi
于 2016-05-31T18:46:51.180 回答
6

因为zsh语法略有不同,但仍比这里的大多数答案短:

> str1='mAtCh'
> str2='MaTcH'
> [[ "$str1:u" = "$str2:u" ]] && echo 'Strings Match!'
Strings Match!
>

这将在比较之前将两个字符串都转换为大写。


另一种方法使用 zsh's ,它允许我们通过使用glob 标志globbing flags直接使用不区分大小写的匹配:i

setopt extendedglob
[[ $str1 = (#i)$str2 ]] && echo "Match success"

# this example compares the variable with a literal string 'match'
[[ $str1 = (#i)match ]] && echo "Match success"
于 2018-07-18T00:31:54.757 回答
5

我遇到了这个很棒的博客/教程/关于处理区分大小写模式的任何内容。下面通过实例对以下三种方法进行详细说明:

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
于 2020-01-08T08:16:46.910 回答
4

grep有一个-i标志,表示不区分大小写,所以让它告诉你 var2 是否在 var1 中。

var1=match 
var2=MATCH 
if echo $var1 | grep -i "^${var2}$" > /dev/null ; then
    echo "MATCH"
fi
于 2010-04-27T20:00:23.960 回答
4

这是我使用 tr 的解决方案:

var1=match
var2=MATCH
var1=`echo $var1 | tr '[A-Z]' '[a-z]'`
var2=`echo $var2 | tr '[A-Z]' '[a-z]'`
if [ "$var1" = "$var2" ] ; then
  echo "MATCH"
fi
于 2016-05-09T19:01:59.223 回答
1

在类 Unix 操作系统上,test 命令检查文件类型并比较值。

str1="MATCH"
str2="match"

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

在类 Unix 操作系统上,test 命令检查文件类型并比较值。

这样很简单。

在几行代码中

于 2021-07-01T23:02:55.990 回答
0

shopt -s nocaseglob

于 2009-11-13T11:38:38.327 回答
-1

'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' 的函数可能重量更轻。

于 2021-06-29T16:33:23.357 回答