==
オペレータは、シェルスクリプト内の2つの文字列を比較するために使用されます。ただし、大文字と小文字を区別せずに2つの文字列を比較したいのですが、どうすればよいですか?これのための標準的なコマンドはありますか?
==
オペレータは、シェルスクリプト内の2つの文字列を比較するために使用されます。ただし、大文字と小文字を区別せずに2つの文字列を比較したいのですが、どうすればよいですか?これのための標準的なコマンドはありますか?
回答:
あなたがバッシュを持っているなら
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"
}
}'
==
2つの文字列を比較するために使用されることを示していますが、応答はcase
ステートメントを使用した大文字と小文字を区別しない比較を示しています。安心させる、shopt
溶液はまた、大文字と小文字を区別しない使用を可能==
、=~
および他の文字列比較演算子。
shopt -u nocasematch
、bashのデフォルトに戻すために、比較が行われた後に実行するのが賢明です。
nocasematch
設定を保存して復元するのが最適です。でそれをつかみ、SHELLNOCASEMATCH=`shopt -p nocasematch`
次にそれを交換しshopt -s nocasematch
、一度完了したら、それを使ってそれを復元します$SHELLNOCASEMATCH
SHELLNOCASEMATCH=$(shopt -p nocasematch; true)
、shopt -p
オプションが設定されていない場合はコード1で終了しset -e
、有効な場合はスクリプトが異常終了する可能性があるためです。
Bashでは、パラメーター拡張を使用して、文字列をすべて小文字/大文字に変更できます。
var1=TesT
var2=tEst
echo ${var1,,} ${var2,,}
echo ${var1^^} ${var2^^}
echo
文の結果をに:-bash: ${var1,,}: bad substitution
shopt -s nocasematch
実装方法はわかりませんが、通常、このような「言語レベル」のソリューションでは正しく処理されます。
これらの答えはすべて、これを行う最も簡単で迅速な方法を無視します(Bash 4がある限り)。
if [ "${var1,,}" = "${var2,,}" ]; then
echo ":)"
fi
そこで行うことは、両方の文字列を小文字に変換し、結果を比較することだけです。
nocasematchの状態を保存します(他の機能が無効にされていることに依存している場合)。
local orig_nocasematch=$(shopt -p nocasematch)
shopt -s nocasematch
[[ "foo" == "Foo" ]] && echo "match" || echo "notmatch"
$orig_nocasematch
注:local
関数内にある場合にのみ使用してください。
case
(ghostdogの答えのものを含む)の文は、常に私の肌のクロールになります
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
tr
アルパイン(をsh
介して提供されるbusybox
)に基づくドッカー化されたアプリケーションでこのメソッドを使用しました。ありがとうございました。
grep
-i
大文字と小文字を区別しないことを意味するフラグがあるので、var2がvar1にあるかどうかを尋ねます。
var1=match
var2=MATCH
if echo $var1 | grep -i "^${var2}$" > /dev/null ; then
echo "MATCH"
fi
以下のため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"
[[ $str1 = (#i)match ]] && echo "Match success"
shopt -s nocaseglob
大文字と小文字を区別するパターンの扱いについて、この素晴らしいブログ/チュートリアル/何にでも遭遇しました。次の3つの方法について、例を使用して詳細に説明します。
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
if
ステートメントを使用して文字列を比較shopt
する場合、このアプローチでは[[ ]]
、シングルブラケット形式ではなく、ダブルブラケット形式の条件を使用する必要があります[ ]
。参照: gnu.org/software/bash/manual/html_node/The-Shopt-Builtin.html