【问题标题】:Double quote in command as variable in a bash命令中的双引号作为bash中的变量
【发布时间】:2015-12-22 14:19:08
【问题描述】:

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

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

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

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

谢谢。 阿尔。

【问题讨论】:

  • 您是否尝试过使用转义字符?说\'/programs/program/log/@level\'
  • ++ xmlstarlet ed --inplace -u /programs/program/log/@level -v 4 ./file.xml + BMWARNING= + '[' -z --info ']' +案例 ${1} 在
  • 嗯?您根本不应该在其中添加字面引用。这不是正确的 XMLStarlet 用法。
  • 也就是说,ed --inplace 不会在 stdout 上打印任何内容,它只是在原地编辑文件,那么您为什么希望它将任何内容放入 WARNING 变量中呢?
  • 因为我正在尝试将基于参数的 xml 更新为 bash。

标签: bash arguments quotes xmlstarlet


【解决方案1】:

在这个表达式中需要文字引号以使 XMLStarlet 找到所需元素的说法是错误的

相反,您正在运行 in-place edit 命令,而捕获标准输出仅在 select 命令(或带有替换的常规编辑)的上下文中才有意义发送到标准输出的文本);对于就地编辑,stdout 将为空。

如果您的目标是捕获与就地编辑操作相关的标准错误:

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

【讨论】:

  • 当我运行命令时,正确找到了元素: xmlstarlet ed --inplace -u "/programs/program/log/@level" -v 4 file.xml
  • @user4711416,这些引号是句法的,而不是字面的;它们被 shell 使用,而不是发送到 XMLStarlet。
  • @user4711416, ...但是,当您将 '"' 放在双引号中时,您将其变为文字,这意味着它被发送到 XMLStarlet,这意味着它的内容被解析为 XPath 字符串而不是表达。
  • @user4711416, ...如果xmlstarlet ed --inplace -u "/programs/program/log/@level" -v 4 file.xml 有效,那么xmlstarlet ed --inplace -u /programs/program/log/@level -v 4 file.xml 也可以正常工作,在这种特定情况下,您的XPath 不包含空格或其他shell 将解析为语法的字符.
  • 我已将“警告”移至每个案例的使用情况,并且效果很好。不知何故,这些在脚本的早期阶段无法定义。谢谢查尔斯的建议,我使用了:)
猜你喜欢
  • 2021-10-23
  • 2023-01-08
  • 2019-04-19
  • 1970-01-01
  • 1970-01-01
  • 2012-01-25
  • 1970-01-01
  • 2016-01-22
  • 1970-01-01
相关资源
最近更新 更多