L'opérateur ==
Permet de comparer deux chaînes dans un script Shell. Cependant, je veux comparer deux chaînes en ignorant la casse, comment peut-on le faire? Existe-t-il une commande standard pour cela?
si vous avez bash
str1="MATCH"
str2="match"
shopt -s nocasematch
case "$str1" in
$str2 ) echo "match";;
*) echo "no match";;
esac
sinon, vous devriez nous dire quel Shell vous utilisez.
alternative, en utilisant awk
str1="MATCH"
str2="match"
awk -vs1="$str1" -vs2="$str2" 'BEGIN {
if ( tolower(s1) == tolower(s2) ){
print "match"
}
}'
Dans Bash, vous pouvez utiliser le développement de paramètres pour modifier une chaîne en toutes les majuscules/minuscules:
var1=TesT
var2=tEst
echo ${var1,,} ${var2,,}
echo ${var1^^} ${var2^^}
Toutes ces réponses ignorent le moyen le plus simple et le plus rapide de procéder (tant que vous avez Bash 4):
if [ "${var1,,}" = "${var2,,}" ]; then
echo ":)"
fi
Tout ce que vous faites est de convertir les deux chaînes en minuscules et de comparer les résultats.
Même réponse que ghostdog74 mais code légèrement différent
shopt -s nocasematch
[[ "foo" == "Foo" ]] && echo "match" || echo "notmatch"
shopt -u nocasematch
Une solution serait de convertir les deux chaînes en haut ou en bas:
test $(echo "string" | /bin/tr '[:upper:]' '[:lower:]') = $(echo "String" | /bin/tr '[:upper:]' '[:lower:]') && echo same || echo different
Une autre façon serait d'utiliser grep:
echo "string" | grep -qi '^String$' && echo same || echo different
Pour korn Shell, j'utilise la commande intégrée de type set (-l pour les minuscules et -u pour les majuscules).
var=True
typeset -l var
if [[ $var == "true" ]]; then
print "match"
fi
Très facile si vous vous fiez à faire une ligne insensible à la casse, comparez:
str1="MATCH"
str2="match"
if [[ $(fgrep -ix $str1 <<< $str2) ]]; then
echo "case-insensitive match";
fi
Voici ma solution en utilisant 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
grep
a un -i
drapeau qui signifie insensible à la casse, alors demandez-lui de vous dire si var2 est dans var1.
var1=match
var2=MATCH
if echo $var1 | grep -i "^${var2}$" > /dev/null ; then
echo "MATCH"
fi
Pour zsh
, la syntaxe est légèrement différente:
> str1='MATCH'
> str2='match'
> [ "$str1" == "$str2:u" ] && echo 'Match!'
Match!
>
Cela va convertir str2
en majuscule avant la comparaison.
Plus d'exemples pour changer de cas ci-dessous:
> xx=Test
> echo $xx:u
TEST
> echo $xx:l
test
shopt -s nocaseglob