2017-01-02 2 views
1

Je travaille sur une automatisation à l'aide Jenkins, où je le schéma et les détails DB stockés commeItérer par un tableau de hachages dans le script ANT

[schema1:db1, schema2:db2] stocké dans une propriété ANT ${schemaValue}

<propertycopy name="schemaValue" from="${SchemaVariable}"/> 

Maintenant, je je essaie de boucle à travers ce tableau de hachages pour exécuter la connexion, J'ai essayé avec

 <for param="theparam" list="${schemaValue}"> 
      <sequential> 
       <echo message="param: @{theparam}"/> 
      </sequential> 
     </for> 

Mais cela considère ${schemaValue} comme Chaîne et non un tableau,

Aide à ce sujet.

EDIT

Comme suggéré par @ AR.3, j'ai essayé avec

<propertyregex override="yes" property="paramValue" input="@{theparam}" regexp=".+:([^\]]+)]?" replace="\1"/> 
<echo message="paramValue: ${paramValue}"/> 
<propertyregex override="yes" property="paramKey" input="@{theparam}" regexp="[?([^\[]+):]" replace="\1"/> 
<echo message="paramKey: ${paramKey}"/> 

$ {} paramValue me donne db1 et db2 correctement

$ {} paramKey me jette erreur

Répondre

1

Il n'y a pas de concept de tableau dans Ant au sens strict qui existe dans les langages de programmation standard. La boucle for va simplement parcourir les éléments d'une chaîne délimitée par un délimiteur (le délimiteur par défaut est ,). Dans votre cas, il ressemble également plus à une carte ou à une liste de paires clé-valeur.

Si le comportement attendu est d'imprimer les valeurs de la carte (db1 et db2), une étape supplémentaire impliquant un remplacement d'expression régulière peut être utilisé:

<for param="theparam" list="${schemaValue}"> 
    <sequential> 
     <propertyregex override="yes" 
       property="paramValue" input="@{theparam}" 
       regexp=".+:([^\]]+)]?" replace="\1"/> 
     <echo message="param: ${paramValue}"/> 
    </sequential> 
</for> 

Ainsi, à l'origine, les valeurs résonnaient contenues dans theparam sera [schema1:db1 et schema2:db2]. Le motif .+:([^\]]+)]? correspondra contre de telles valeurs, en faisant correspondre contre:

  1. un ou plusieurs caractères,
  2. suivie d'un :,
  3. suivie par des caractères non ],
  4. suivie par zéro ou un ].

Le propertyregex mettra la valeur du premier groupe, à savoir celui identifié par ([^\]]+) dans une propriété paramValue. Ce sera en fait la valeur après le côlon.

Son exécution doit imprimer:

[echo] param: db1 
[echo] param: db2 

EDIT:

Pour obtenir la clé à la place, vous pouvez utiliser l'expression rationnelle suivante:

<propertyregex override="yes" property="paramKey" 
       input="@{theparam}" regexp="\[?([^\[]+):[^\]]+]?" replace="\1"/> 
+0

- Est-il possible d'obtenir des valeurs comme schema1: db1 puis sch2ma2: db2. Parce que je reçois ici des noms de schémas dynamiques avec le nom de la base de données. – useranon

+0

@Jasmine Oui, il suffit de modifier l'expression rationnelle ci-dessus selon vos besoins. Dans ce cas, vous pouvez essayer [? ([^ \ [] +: [^ \]] +)]? – manouti

+0

J'ai essayé avec "([^ \ [] + :)" de trouver la clé $ {paramKey} mais ce n'est pas rendu comme prévu. – useranon