6
votes

BASH Vérifier l'élément en tableau pour les éléments dans un autre tableau

Je suis venu sur cette fonction cool Bash pour vérifier si un tableau contient un élément:

if CONTAINS_ELEMENT $element "${array[@]}"; then
... 
fi


3 commentaires

Pas correcte! Essayez "$ {@: 2}" .


Très similaire aux questions d'intersection Array 1 et .


Pour montrer que la question a été résolue, cochez une des réponses comme "acceptée".


4 Réponses :


-1
votes

Cela devrait le faire: xxx

session de test: xxx

bien sûr, il y a des moyens plus rapides de le faire si les tableaux sont triés ou aucun des éléments de matrice contient des espaces blancheurs.


8 commentaires

Comment prendriez-vous deux tableaux comme paramètres? Ce n'est pas possible.


Vous pouvez prendre la taille de la première matrice comme premier paramètre :-)


"En outre, si les deux premiers éléments des tableaux respectifs sont différents, il retourne 0." Que veux-tu dire? Je viens de le tester, et ça marche bien.


Pouvez-vous s'il vous plaît supprimer le commentaire dans ce cas? C'est juste du bruit maintenant: /


J'ai enlevé le commentaire, mais une moitié était vraie: la fonction ne prend pas de paramètres.


@CHOROBA: IMHO IN BASH Il est correct d'utiliser des paramètres implicites.


@Truey: Je n'ai pas dit que ce n'est pas correct. C'est juste un comportement différent par rapport à la fonction d'origine.


@choroba: exactement la même chose ne peut être mise en œuvre. Une certaine astuce doit être ajoutée comme bash ne peut pas passer deux tableaux distincts sur une fonction.



3
votes

corrigé # 3

Essayez le code ci-dessous. Arrcontains Prenez deux arguments, le nom des deux tableaux. Il crée un hachage temporaire de larrr1 , puis vérifiez si des éléments de larr2 sont dans le hachage. De cette façon, le pour -Loops peut être évité. xxx

sortie: xxx

Autre moyen pourrait être de définir un caractère de séparation et de concaténer le premier hachage. Ensuite, recherchez la correspondance de la chaîne SEPITEMSEP . xxx

sortie: xxx


10 commentaires

@ L0B0: Vous avez raison! La première fonction la manipulait mal. J'ai corrigé. Merci!


@ L0B0: Je voulais juste uplifier votre dernier commentaire, mais il a été supprimé ...;) De toute façon, merci pour eux!


Cela échoue quand je l'essaie. Il ne renvoie rien, peu importe quoi.


@ Dan-Simonmyrland: Désolé, j'ai réagi de ma dernière correction! Les mauvaises citations simples ont été supprimées. Corrigée! Merci!


Juste FYI: Les tableaux associatifs sont Soutenu par Bash 4.0-Alpha et Newer .


@ L0B0: Yepp. Si vous avez plus ancien, essayez arrcontatsre version ... il est sans hashless. :)


Sauf arrcontatsre ne fonctionnera pas si votre séparateur est dans la chaîne. Je préfère les solutions qui fonctionnent, peu importe l'entrée.


@ L0B0: Certains caractères non imprimés peuvent être utilisés comme séparateur.


@Truey et votre entrée pourraient toujours contenir ce personnage. Le point est qu'il n'ya absolument aucun caractère (ou séquence de caractères) que vous puissiez utiliser comme séparateur qui ne peut pas également faire partie de l'entrée.


Tard pour la fête, mais je pense que les refues de noms peuvent être utilisés dans Bash 4.3+ pour rendre l'accès au tableau. Ici, on déclarerait Larrr1 comme ceci: déclarer -n larrr1 = "1 $ 1" , en supprimant la nécessité du méchant (et potentiellement dangereux) eval .



0
votes

regarder les liens ci-dessus, je suis venu sur une solution qui fait presque ce que j'en ai besoin pour faire, mais pas tout à fait: xxx

maintenant ce code fonctionne lors du passage du paramètre "H", Mais pas lorsque vous passez les autres paramètres de la matrice (-H - help aide). Désolé si je fais une erreur stupide ici, je suis un peu Nuub quand il s'agit de bish script :)


2 commentaires

Un problème de syntaxe: pr1 = "$ paramètre [@]}" peut être pr1 = "$ {paramètres [@]}" . Mais je peux suggérer d'utiliser local pr1 = ... . Et un problème de sémantique: le si retournera dans la première boucle dans les paramètres . Je suppose que la partie sinon n'est pas nécessaire.


Ok, votre propre solution s'est révélée une meilleure façon de résoudre mon problème. Merci encore pour votre aide!



1
votes

boucle à l'intérieur de la boucle: xxx

montrera: xxx


0 commentaires