shell脚本中字符串的不区分大小写比较

时间:2009-11-13 11:31:51

标签: string shell compare case-insensitive

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

14 个答案:

答案 0 :(得分:126)

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

var1=TesT
var2=tEst

echo ${var1,,} ${var2,,}
echo ${var1^^} ${var2^^}

答案 1 :(得分:90)

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

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

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

答案 2 :(得分:55)

如果你有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"
  }
}'

答案 3 :(得分:27)

与ghostdog74的回答相同,但代码略有不同

shopt -s nocasematch
[[ "foo" == "Foo" ]] && echo "match" || echo "notmatch"
shopt -u nocasematch

答案 4 :(得分:11)

一种方法是将两个字符串转换为上限或下限:

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

答案 5 :(得分:7)

对于korn shell,我使用了排版内置命令(小写为-l,大写为-u)。

var=True
typeset -l var
if [[ $var == "true" ]]; then
    print "match"
fi

答案 6 :(得分:4)

如果你fgrep做一个不区分大小写的行比较很容易:

str1="MATCH"
str2="match"

if [[ $(fgrep -ix $str1 <<< $str2) ]]; then
    echo "case-insensitive match";
fi

答案 7 :(得分:3)

我遇到了这个很棒的博客/教程/有关dealing with case sensitive pattern的一切。通过示例详细说明以下三种方法:

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

答案 8 :(得分:2)

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

答案 9 :(得分:2)

这是我使用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

答案 10 :(得分:1)

shopt -s nocaseglob

答案 11 :(得分:1)

对于zsh,语法略有不同:

> str1='MATCH'
> str2='match'
> [ "$str1" == "$str2:u" ] && echo 'Match!'
Match!
>

这将在比较之前将str2转换为大写。

下面提供了更多更改大小写的示例:

> xx=Test
> echo $xx:u
TEST
> echo $xx:l
test

答案 12 :(得分: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' 的函数可能重量更轻。

答案 13 :(得分:0)

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

str1="MATCH"
str2="match"

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

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

就这么简单。

几行代码