在bash

时间:2015-12-22 14:19:08

标签: bash arguments quotes xmlstarlet

我正在尝试创建一个包含参数的xmlstarlet命令变量:

WARNING=$(xmlstarlet ed --inplace -u "'"/programs/program/log/@level"'" -v 4 ${FILE})

不幸的是,如果没有双引号或单引号,即使xmlstarlet也不接受/看到该元素。

欢迎在命令中包含引号作为输出的任何帮助:)

谢谢。 AL

1 个答案:

答案 0 :(得分:1)

声明在此表达式中需要字面引号以便XMLStarlet找到所需元素

相反,当您在 select 命令(或传统编辑)的上下文中捕获stdout时,您正在运行就地编辑命令将替换文本发送到stdout);对于就地编辑,stdout将为空。

如果您的目标是捕获与就地编辑操作相关联的stderr:

warnings=$(xmlstarlet ed --inplace -u "/programs/program/log/@level" -v 4 "$file" 2>&1)

...将stderr复制到stdout,确保它被捕获。

那就是说,如果你抓住warnings的目标是检查成功,不要依赖于查看stderr;相反,请检查退出状态:

if warnings=$(xmlstarlet ed --inplace ... 2>&1); then
  echo "Update succeeded" >&2
else
  echo "Update failed: $warnings" >&2
fi