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

问题描述 投票:0回答:14

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

string shell compare case-insensitive
14个回答
224
投票

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

${var,,}
表示小写,
${var^^}
表示大写。

var1=TesT
var2=tEst

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

180
投票

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

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

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


95
投票

如果你有bash

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

否则,您应该告诉我们您正在使用什么 shell。

替代方案,使用 awk

str1="MATCH"
str2="match"
awk -vs1="$str1" -vs2="$str2" 'BEGIN {
  if ( tolower(s1) == tolower(s2) ){
    print "match"
  }
}'

52
投票

保存

nocasematch
的状态(以防某些其他功能依赖于它被禁用):

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

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

$orig_nocasematch

注意

local
仅在函数内部需要。
另外,当
; true
打开并且
set -e
失败时,
$(shopt -p nocasematch)
部分将阻止 shell 退出(因为根本没有设置 nocasematch)。


25
投票

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

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

10
投票

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

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

10
投票

对于

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

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

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


另一种方法使用 zsh 的

globbing flags
,它允许我们通过使用
i
glob 标志直接使用不区分大小写的匹配:

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

# this example compares the variable with a literal string 'match'
[[ $str1 = (#i)match ]] && echo "Match success"

7
投票

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

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

7
投票

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

str1="MATCH"
str2="match"

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

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

4
投票

grep
有一个
-i
标志,这意味着不区分大小写,因此要求它告诉您 var2 是否在 var1 中。

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

0
投票

shopt -s nocaseglob


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


-2
投票

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

str1="MATCH"
str2="match"

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

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

这样就非常简单了。

几行代码

© www.soinside.com 2019 - 2024. All rights reserved.