176

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

4

14 に答える 14

160

これらの回答はすべて、これを行う最も簡単で迅速な方法を無視しています (Bash 4 を使用している場合)。

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

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

于 2014-12-28T19:13:42.557 に答える
87

バッシュがある場合

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

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

test $(echo "string" | /bin/tr '[:upper:]' '[:lower:]') = $(echo "String" | /bin/tr '[:upper:]' '[:lower:]') && echo same || echo different

もう 1 つの方法は、grep を使用することです。

echo "string" | grep -qi '^String$' && echo same || echo different
于 2009-11-13T11:52:35.140 に答える
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 に答える
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 に答える
0

shopt -s nocaseglob

于 2009-11-13T11:38:38.327 に答える