L' ==
opérateur est utilisé pour comparer deux chaînes dans un script shell. Cependant, je veux comparer deux chaînes en ignorant la casse, comment cela peut-il être fait? Existe-t-il une commande standard pour cela?
L' ==
opérateur est utilisé pour comparer deux chaînes dans un script shell. Cependant, je veux comparer deux chaînes en ignorant la casse, comment cela peut-il être fait? Existe-t-il une commande standard pour cela?
Réponses:
si vous avez bash
str1="MATCH"
str2="match"
shopt -s nocasematch
case "$str1" in
$str2 ) echo "match";;
*) echo "no match";;
esac
sinon, vous devez 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"
}
}'
==
est utilisé pour comparer deux chaînes, mais la réponse démontre une comparaison insensible à la casse à l'aide d'une case
instruction. Rassura la shopt
solution permet également l' utilisation de la casse de ==
, =~
et d' autres opérateurs de comparaison de chaînes.
shopt -u nocasematch
fois la comparaison effectuée pour revenir à la valeur par défaut de bash.
nocasematch
paramètre. Prenez-le avec SHELLNOCASEMATCH=`shopt -p nocasematch`
puis changez-le avec shopt -s nocasematch
et une fois terminé, restaurez-le avec$SHELLNOCASEMATCH
SHELLNOCASEMATCH=$(shopt -p nocasematch; true)
car se shopt -p
terminera avec le code 1 si l'option n'est pas définie, et cela peut entraîner l'abandon du script s'il set -e
est en vigueur.
Dans Bash, vous pouvez utiliser l'expansion des paramètres pour modifier une chaîne en minuscules / majuscules:
var1=TesT
var2=tEst
echo ${var1,,} ${var2,,}
echo ${var1^^} ${var2^^}
echo
instruction entraîne:-bash: ${var1,,}: bad substitution
shopt -s nocasematch
est implémenté mais généralement de telles solutions «au niveau du langage» le gèrent correctement.
Toutes ces réponses ignorent le moyen le plus simple et le plus rapide de le faire (tant que vous avez Bash 4):
if [ "${var1,,}" = "${var2,,}" ]; then
echo ":)"
fi
Tout ce que vous faites ici est de convertir les deux chaînes en minuscules et de comparer les résultats.
Enregistrez l'état de nocasematch (au cas où une autre fonction dépendrait de sa désactivation):
local orig_nocasematch=$(shopt -p nocasematch)
shopt -s nocasematch
[[ "foo" == "Foo" ]] && echo "match" || echo "notmatch"
$orig_nocasematch
Remarque: à n'utiliser que local
si c'est à l'intérieur d'une fonction.
case
Bien parce que les déclarations (y compris celles de la réponse de Ghostdog) feront toujours ramper ma peau
Une façon 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
tr
méthode dans mes applications docker-ized basées sur alpine (qui fournit sh
via busybox
). Je vous remercie.
Pour le shell korn, j'utilise la commande intégrée de typeset (-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 fgrep de faire une comparaison de ligne insensible à la casse:
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
Car zsh
la syntaxe est légèrement différente, mais toujours plus courte que la plupart des réponses ici:
> str1='mAtCh'
> str2='MaTcH'
> [[ "$str1:u" = "$str2:u" ]] && echo 'Strings Match!'
Strings Match!
>
Cela convertira les deux chaînes en majuscules avant la comparaison.
Une autre méthode utilise zsh's globbing flags
, ce qui nous permet d'utiliser directement la correspondance insensible à la casse en utilisant l' i
indicateur glob:
setopt extendedglob
[[ $str1 = (#i)$str2 ]] && echo "Match success"
[[ $str1 = (#i)match ]] && echo "Match success"
shopt -s nocaseglob
Je suis tombé sur ce super blog / tutoriel / quoi que ce soit sur le traitement des motifs sensibles à la casse . Les trois méthodes suivantes sont expliquées en détail avec des exemples:
1. Convertissez le motif en minuscules à l'aide de la commande 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. Utilisez des expressions régulières avec des modèles de cas
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. Activez 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
instructions, l'shopt
approche vous oblige à utiliser la forme double crochet[[ ]]
de conditionnel au lieu de la forme simple crochet[ ]
. Voir aussi: gnu.org/software/bash/manual/html_node/The-Shopt-Builtin.html