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?
string
shell
compare
case-insensitive
Sachin Chourasiya
la source
la source
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==
est utilisé pour comparer deux chaînes, mais la réponse démontre une comparaison insensible à la casse à l'aide d'unecase
instruction. Rassura lashopt
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 avecSHELLNOCASEMATCH=`shopt -p nocasematch`
puis changez-le avecshopt -s nocasematch
et une fois terminé, restaurez-le avec$SHELLNOCASEMATCH
SHELLNOCASEMATCH=$(shopt -p nocasematch; true)
car seshopt -p
terminera avec le code 1 si l'option n'est pas définie, et cela peut entraîner l'abandon du script s'ilset -e
est en vigueur.Dans Bash, vous pouvez utiliser l'expansion des paramètres pour modifier une chaîne en minuscules / majuscules:
la source
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):
Tout ce que vous faites ici est de convertir les deux chaînes en minuscules et de comparer les résultats.
la source
Enregistrez l'état de nocasematch (au cas où une autre fonction dépendrait de sa désactivation):
Remarque: à n'utiliser que
local
si c'est à l'intérieur d'une fonction.la source
case
Bien parce que les déclarations (y compris celles de la réponse de Ghostdog) feront toujours ramper ma peauUne façon serait de convertir les deux chaînes en haut ou en bas:
Une autre façon serait d'utiliser grep:
la source
tr
méthode dans mes applications docker-ized basées sur alpine (qui fournitsh
viabusybox
). 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).
la source
Très facile si vous fgrep de faire une comparaison de ligne insensible à la casse:
la source
if fgrep -qix -- "$str1" <<<"$str2"; then
place.Voici ma solution en utilisant tr:
la source
grep
a un-i
drapeau qui signifie insensible à la casse, alors demandez-lui de vous dire si var2 est dans var1.la source
Car
zsh
la syntaxe est légèrement différente, mais toujours plus courte que la plupart des réponses ici: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:la source
shopt -s nocaseglob
la source
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
2. Utilisez des expressions régulières avec des modèles de cas
3. Activez nocasematch
la source