在ANT脚本

时间:2017-01-02 11:08:28

标签: arrays loops foreach ant ant-contrib

我正在使用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="\1"/>
<echo message="paramValue: ${paramValue}"/>
<propertyregex override="yes" property="paramKey" input="@{theparam}" regexp="[?([^\[]+):]" replace="\1"/>
<echo message="paramKey: ${paramKey}"/>

$ {paramValue}正确地给我db1和db2

$ {paramKey}引发了我的错误

1 个答案:

答案 0 :(得分:1)

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

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

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

最初,theparam中包含的回显值将为[schema1:db1schema2:db2]。模式.+:([^\]]+)]?将匹配此类值,方法是匹配:

  1. 一个或多个字符,
  2. 后跟:
  3. 后跟非]个字符,
  4. 后跟零或一]
  5. propertyregex会将第一个组的值,即([^\]]+)匹配的值放在属性paramValue中。这实际上是结肠后的值。

    运行它应该打印:

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

    修改

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

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