web-dev-qa-db-ja.com

シェルスクリプト内の文字列の大文字と小文字を区別しない比較

==演算子は、シェルスクリプトの2つの文字列を比較するために使用されます。ただし、大文字と小文字を区別せずに2つの文字列を比較したいのですが、どうすればよいですか?このための標準コマンドはありますか?

112

バッシュがある場合

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"
  }
}'
65
ghostdog74

Bashでは、パラメーター展開を使用して、文字列をすべて小文字/大文字に変更できます。

var1=TesT
var2=tEst

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

これらの答えはすべて、これを行う最も簡単で迅速な方法を無視します(Bash 4がある場合):

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

そこで行うことは、両方の文字列を小文字に変換し、結果を比較することです。

95
Riot

Ghostdog74からの回答と同じですが、コードがわずかに異なります

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

1つの方法は、両方の文字列を上位または下位に変換することです。

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
12
Randy Proctor

Kornシェルの場合は、typeset組み込みコマンドを使用します(小文字の場合は-l、大文字の場合は-u)。

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

Fgrepで大文字と小文字を区別しない行比較を行うと、非常に簡単です。

str1="MATCH"
str2="match"

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

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
3
stones333

grepには-iフラグがあります。これは大文字と小文字を区別しないことを意味するため、var2がvar1にあるかどうかを尋ねます。

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

zshの構文はわずかに異なります。

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

これにより、比較前にstr2が大文字に変換されます。

大文字小文字を変更するその他の例:

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

shopt -s nocaseglob

1
ennuikiller