我正在尝试使用 xmllint 搜索 xml 文件并将所需的值存储到数组中。这是我正在做的事情:
#!/bin/sh
function getProfilePaths {
unset profilePaths
unset profilePathsArr
profilePaths=$(echo 'cat //profiles/profile/@path' | xmllint --shell file.xml | grep '=' | grep -v ">" | cut -f 2 -d "=" | tr -d \")
profilePathsArr+=( $(echo $profilePaths))
return 0
}
在另一个功能中,我有:
function useProfilePaths {
getProfilePaths
for i in ${profilePathsArr[@]}; do
echo $i
done
return 0
}
useProfilePaths
无论我是在命令行上手动执行命令还是从不同的函数调用它们作为包装脚本的一部分,函数的行为都会发生变化。当我可以从包装脚本中执行函数时,数组中的项为 1,与我从命令行执行时相比,数组中的项为 2:
$ echo ${#profilePathsArr[@]}
2
回显时 profilePaths 的内容如下所示:
$ echo ${profilePaths}
/Profile/Path/1 /Profile/Path/2
我不确定 xmllint 调用的分隔符是什么。
当我从包装脚本调用函数时,for 循环的第一次迭代的内容如下所示:
for i in ${profilePathsArr[@]}; do
echo $i
done
第一个回声看起来像:
/Profile/Path/1
/Profile/Path/2
...第二个回声是空的。
谁能帮我调试这个问题?如果我能找出 xmllint 使用的分隔符是什么,也许我可以正确解析数组中的项目。
仅供参考,我已经尝试过以下方法,结果相同:
profilePaths=($(echo 'cat //profiles/profile/@path' | xmllint --shell file.xml | grep '=' | grep -v ">" | cut -f 2 -d "=" | tr -d \"))