遍历 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
循环将简单地迭代由定界符(默认定界符是 ,
)定界的字符串的元素。在您的情况下,它看起来更像是一个映射或键值对列表。
如果预期的行为是打印地图中的值(db1
和 db2
),可以使用涉及正则表达式替换的附加步骤:
<for param="theparam" list="${schemaValue}">
<sequential>
<propertyregex override="yes"
property="paramValue" input="@{theparam}"
regexp=".+:([^\]]+)]?" replace=""/>
<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=""/>
我正在使用 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
循环将简单地迭代由定界符(默认定界符是 ,
)定界的字符串的元素。在您的情况下,它看起来更像是一个映射或键值对列表。
如果预期的行为是打印地图中的值(db1
和 db2
),可以使用涉及正则表达式替换的附加步骤:
<for param="theparam" list="${schemaValue}">
<sequential>
<propertyregex override="yes"
property="paramValue" input="@{theparam}"
regexp=".+:([^\]]+)]?" replace=""/>
<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=""/>