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
$ 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.
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
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.