我正在使用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}引发了我的错误
答案 0 :(得分: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]
。模式.+:([^\]]+)]?
将匹配此类值,方法是匹配:
:
,]
个字符,]
。 propertyregex
会将第一个组的值,即([^\]]+)
匹配的值放在属性paramValue
中。这实际上是结肠后的值。
运行它应该打印:
[echo] param: db1
[echo] param: db2
修改强>
要获取密钥,您可以使用以下正则表达式:
<propertyregex override="yes" property="paramKey"
input="@{theparam}" regexp="\[?([^\[]+):[^\]]+]?" replace="\1"/>