2017-01-02 13 views
1

Я работаю на некоторые автоматизации с использованием Дженкинс, где у меня есть схема и детали БД хранится какИтерация через массив хэшей в скрипте

[schema1:db1, schema2:db2] хранится в ANT собственности ${schemaValue}

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

Теперь я пытаюсь Переберите этот массив хэшей, чтобы выполнить соединение, я попытался с

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

Но это рассматривает ${schemaValue} как String, а не массив,

Помощь по этому вопросу.

EDIT

Как было предложено @ AR.3, я попытался с

<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} дает мне DB1 и DB2 правильно

$ {} paramKey бросает меня error

ответ

1

В Ant нет понятия массива в строгом смысле, который существует в стандартных языках программирования. Цикл for будет просто перебирать элементы строки, ограничиваемой разделителем (разделитель по умолчанию равен ,). В вашем случае это также больше похоже на карту или список пар ключ-значение.

Если ожидаемое поведение является печать значения в карте (db1 и db2), дополнительный шаг с участием регулярной замены можно использовать выражение:

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

Так первоначально, отражаемое значение, содержащийся в theparam будет [schema1:db1 и schema2:db2]. Шаблон .+:([^\]]+)]? будет соответствовать против таких значений, путем сопоставления против:

  1. одного или более символов,
  2. с последующим :,
  3. с последующим не- ] символов,
  4. с последующим нулем или единицей ].

propertyregex поставит значение первой группы, то есть в одной найденной ([^\]]+) в свойстве paramValue. Это будет фактически значением после двоеточия.

Запуск он должен напечатать:

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

EDIT:

Чтобы получить ключ вместо этого, вы можете использовать следующее регулярное выражение:

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

- Можно ли получить значения например schema1: db1, а затем sch2ma2: db2. Потому что здесь я получаю динамические имена схем с именем базы данных. – useranon

+0

@ Jasmine Да, просто измените приведенное выше регулярное выражение в соответствии с вашими потребностями. В этом случае вы можете попробовать '[? ([^ \ [] +: [^ \]] +)]?'. – manouti

+0

Я попытался с "([^ \ [] + :)", чтобы найти ключ $ {paramKey}, но он не отображается как ожидалось. – useranon

 Смежные вопросы

  • Нет связанных вопросов^_^