在If条件下不区分大小写

时间:2014-10-12 00:12:05

标签: bash shell

我有这个csv文件,我需要计算满足行条目在特定年份范围之间并且artist_name匹配name参数的条件的行数。但字符串匹配应该不区分大小写。我如何在if循环中实现这一点..

我是初学者,所以请耐心等待我

#!/bin/bash

file="$1"
artist="$2" 
from_year="$(($3-1))"
to_year="$(($4+1))"
count=0

while IFS="," read arr1 arr2 arr3 arr4 arr5 arr6 arr7 arr8 arr9 arr10 arr11 ; do

if [[ $arr11 -gt $from_year ]] && [[ $arr11 -lt $to_year ]] && [[ $arr7  =~ $artist ]]; then
count=$((count+1))
fi

done < "$file"
echo $count

$ arr7 =〜$ artist部分是我需要进行修改的地方

3 个答案:

答案 0 :(得分:4)

Bash有一个用于将字符串转换为小写的内置方法。一旦它们都是小写的,你可以比较它们是否相等。例如:

$ arr7="Rolling Stones"
$ artist="rolling stoneS"
$ [ "${arr7,,}" = "${artist,,}" ] && echo "Matches!"
Matches!
$ [[ ${arr7,,} =~ ${artist,,} ]] && echo "Matches!"
Matches!

详细信息

${parameter,,}将字符串中的所有字符转换为小写字母。如果要转换为大写,请使用${parameter^^}。如果您只想转换某些字符,请使用${parameter,,pattern},其中仅更改匹配pattern的字符。关于此的更多细节由man bash`记录:

  

$ {参数^图案}
  $ {parameter ^^ pattern}
  $ {parameter,pattern}
  $ {参数,,图案}

     

案例修改。此扩展修改参数中字母字符的大小写。该模式扩展为   只产生一种模式                 在路径名扩展中。 ^运算符将匹配模式的小写字母转换为大写;运营商   转换匹配的大写                 字母小写。 ^^和,,exansions转换扩展值中的每个匹配字符; ^和,扩展   匹配和转换                 只有扩展值中的第一个字符。如果省略pattern,则将其视为一个匹配每个的?   字符。如果参数                 是@或*,案例修改操作依次应用于每个位置参数,扩展是   结果清单。如果                 parameter是一个用@或*下标的数组变量,case修改操作应用于数组的每个成员   反过来,和                 扩展是结果列表。

兼容性

这些案例修改方法需要bash版本4(2009年2月20日发布)或更好。

答案 1 :(得分:4)

在bash版本4中引入了bash案例转换(${var,,}${var^^})(不久前)。但是,如果您使用的是Mac OS X,则很有可能有bash v3.2,它本身并没有实现大小写转换。

在这种情况下,您可以使用tr更低效地进行低级别的比较并进行更多输入:

if [[ $(tr "[:upper:]" "[:lower:]" <<<"$arr7") = $(tr "[:upper:]" "[:lower:]" <<<"$artist") ]]; then
  # ...
fi

顺便说一句,=~进行正则表达式比较,而不是字符串比较。你几乎肯定想要=。此外,您可以使用算术复合命令[[ $x -lt $y ]]而不是(( x < y ))。 (在算术扩展中,没有必要使用$来表示变量。)

答案 2 :(得分:0)

使用shopt -s nocasematch

<强>演示

#!/bin/bash

words=(Cat dog mouse cattle scatter)


#Print words from list that match pat
print_matches()
{
    pat=$1
    echo "Pattern to match is '$pat'"
    for w in "${words[@]}"
    do
        [[ $w =~ $pat ]] &&  echo "$w"
    done
    echo
}

echo -e "Wordlist: (${words[@]})\n"

echo "Normal matching"
print_matches 'cat'
print_matches 'Cat'

echo -e "-------------------\n"

echo "Case-insensitive matching"
shopt -s nocasematch

print_matches 'cat'
print_matches 'CAT'

echo -e "-------------------\n"

echo "Back to normal matching"
shopt -u nocasematch

print_matches 'cat'

<强>输出

Wordlist: (Cat dog mouse cattle scatter)

Normal matching
Pattern to match is 'cat'
cattle
scatter

Pattern to match is 'Cat'
Cat

-------------------

Case-insensitive matching
Pattern to match is 'cat'
Cat
cattle
scatter

Pattern to match is 'CAT'
Cat
cattle
scatter

-------------------

Back to normal matching
Pattern to match is 'cat'
cattle
scatter