Ne tenez pas compte de l’ordre des mots lorsque vous comparez deux variables

Je veux comparer deux variables en utilisant shell.

$a="abc pqr mno xyz" $b="mno pqr xyz abc" 

Ici, deux valeurs de variable sont identiques (seul l’ordre des mots n’est pas le même dans la variable). Si je compare $a et $b cela signifie que $a et $b ne sont pas les mêmes, mais je veux que la commande shell compare et dise que les deux contenus sont identiques.

Définissons nos variables:

 a="abc pqr mno xyz" b="mno pqr xyz abc" 

Définissons maintenant une fonction d’aide qui met les mots dans l’ordre alphabétique:

 sorted() { echo "$1" | sed 's/[[:space:]][[:space:]]*/\n/g' | sort; } 

Maintenant, en utilisant notre fonction d’assistance, testons l’égalité:

 [ "$(sorted "$a")" = "$(sorted "$b")" ] && echo Equal Equal 

Exemple de cordes inégales

 $ a="abc pqr mno xyz mmm" $ b="mno pqr xyz abc" $ [ "$(sorted "$a")" = "$(sorted "$b")" ] && echo Equal $ 

À titre d’exemple de ce qui est sorted , regardons uniquement son résultat:

 $ a="abc pqr mno xyz mmm" $ sorted "$a" abc mmm mno pqr xyz 

Comme indiqué ci-dessus, sorted place tous les mots dans l’ordre alphabétique.

Afficher un message dans les deux cas

Les éléments suivants afficheront également Not Equal si les chaînes ne sont pas égales:

 if [ "$(sorted "$a")" = "$(sorted "$b")" ]; then echo Equal; else echo Not Equal; fi 

Ou, sur plusieurs lignes:

 if [ "$(sorted "$a")" = "$(sorted "$b")" ] then echo Equal else echo Not Equal fi 

Comme echo renvoie toujours true, les éléments suivants fonctionneront également:

 [ "$(sorted "$a")" = "$(sorted "$b")" ] && echo Equal || echo Not Equal 

sortingés et bash

Cette question est balisée avec un simple shell . Si, toutefois, le shell est bash, alors on pourrait définir une fonction sorted sans utiliser sed comme suit:

 sorted() { echo "${1// /$'\n'}" | sort; } 

Cette fonction diffère légèrement de la précédente en ce que seuls les espaces, et non les tabulations ou autres espaces, sont autorisés en tant que séparateurs de mots et que plusieurs espaces ne sont pas fusionnés en un seul mot.