bash脚本根据先前的值更新XML元素属性

bash脚本根据先前的值更新XML元素属性,xml,bash,Xml,Bash,我有一个由字符串组成的xml文件 <server name="srv-usr--crt-Internal.vcdn--lfagent1"> 及 ^^^^^^^^ 我想运行一个bash脚本,它通过更改服务器名称中的值来连续执行xml文件,即第一次将值设置为lfagent1和lfagent2,执行xml文件,然后值更改为lfagent3和lfagent4。应该有大约500到1000次这样的迭代 如何为此测试编写bash脚本?此答案用于安全地解析和更新XML 第一个作业是提取内容

我有一个由字符串组成的xml文件

<server name="srv-usr--crt-Internal.vcdn--lfagent1">


^^^^^^^^
我想运行一个bash脚本,它通过更改服务器名称中的值来连续执行xml文件,即第一次将值设置为
lfagent1
lfagent2
,执行xml文件,然后值更改为
lfagent3
lfagent4
。应该有大约500到1000次这样的迭代

如何为此测试编写bash脚本?

此答案用于安全地解析和更新XML

第一个作业是提取内容:

filename="input.xml"
IFS=$'\n' read -r -d '' -a old_names \
  < <(xmlstarlet sel -t -m '//server/@name' -v . -n <"$filename")
最后,生成并运行更新XML文件的命令:

update_command=( xmlstarlet ed )
for idx in ${!new_names[@]}; do
  update_command+=(
    -u "//server[$((idx + 1))]/@name" # XPath uses 1-indexed values
    -v "${new_names[$idx]}"           # ...whereas bash arrays are 0-indexed
  )
done
tempfile=$(mktemp "$filename.XXXXXX")
"${update_command[@]}" <"$filename" >"$tempfile" && mv "$tempfile" "$filename"
update_命令=(xmlstarlet ed)
对于${!new_names[@]}中的idx;做
更新命令+=(
-u”//server[$((idx+1))]/@name“#XPath使用1索引值
-v“${new_names[$idx]}”#…而bash数组是0索引的
)
完成
tempfile=$(mktemp“$filename.XXXXXX”)
${update_command[@]}“$tempfile”和&mv“$tempfile”$filename”

使用适当的XML工具处理XML。例如:


“执行一个xml文件”是什么意思?如果我们知道如何分别处理文件中的两个
server
条目——如果每个条目都有不同的XPath路径,那么这会很有帮助。不断更改它有什么意义?为什么不在所有迭代之后将其更改为最终结果?@Barmar,…我假设在每次迭代之间都会运行其他测试代码。一个选项可能是根据需要将原始文件复制/粘贴到任意多个克隆中,替换正在进行的lfagent字符串,最后对文件进行分类并“执行”(不管是什么意思)结果是,这实际上已经被端到端测试过了。对错误的第一次迭代表示歉意。
new_names=( )
for name in "${old_names[@]}"; do
  name_prefix=${name%%[0-9]*}
  old_number=${name#$name_prefix}
  new_number=$(( old_number + ${#old_names[@]} ))
  new_names+=( "${name_prefix}${new_number}" )
done
update_command=( xmlstarlet ed )
for idx in ${!new_names[@]}; do
  update_command+=(
    -u "//server[$((idx + 1))]/@name" # XPath uses 1-indexed values
    -v "${new_names[$idx]}"           # ...whereas bash arrays are 0-indexed
  )
done
tempfile=$(mktemp "$filename.XXXXXX")
"${update_command[@]}" <"$filename" >"$tempfile" && mv "$tempfile" "$filename"
open file.xml ;
for //server {
    my $x = xsh:match(@name, '^(srv-usr--crt-Internal.vcdn--lfagent)([0-9]+)$') ;
    if (2 = count($x))
        set @name concat($x[1], 2+$x[2]) ;
}
save :b ;