遍历 ANT 脚本中的哈希数组

Iterate through array of hashes in ANT script

我正在使用 Jenkins 进行一些自动化工作,我将模式和数据库详细信息存储在其中

[schema1:db1, schema2:db2] 存储在一个 ANT 属性 ${schemaValue}

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

现在我试图遍历这个哈希数组来执行连接, 我试过

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

但是这将 ${schemaValue} 视为字符串而不是数组,

求助。

编辑

根据@AR.3 的建议,我已经尝试过

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

${paramValue} 正确地给出了 db1 和 db2

${paramKey} 抛出错误

Ant 中不存在标准编程语言中严格意义上的数组概念。 for 循环将简单地迭代由定界符(默认定界符是 ,)定界的字符串的元素。在您的情况下,它看起来更像是一个映射或键值对列表。

如果预期的行为是打印地图中的值(db1db2),可以使用涉及正则表达式替换的附加步骤:

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

所以最初,theparam 中包含的回显值将是 [schema1:db1schema2:db2]。模式 .+:([^\]]+)]? 将通过匹配以下值来匹配这些值:

  1. 一个或多个字符,
  2. 后跟 :
  3. 后跟非]个字符,
  4. 后跟零个或一个 ]

propertyregex 会将第一组的值,即与 ([^\]]+) 匹配的值放在 属性 paramValue 中。这实际上是冒号后的值。

运行 它应该打印:

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

编辑:

要获取密钥,您可以使用以下正则表达式:

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