【问题标题】:sed command creation via shell script - quotes and sed通过 shell 脚本创建 sed 命令 - 引号和 sed
【发布时间】:2015-06-18 21:05:11
【问题描述】:

我在 shell 脚本中实现了一个模板渲染器。模板变量在模板中由@VAR_NAME@ 表示,它们的值在单独的shell 脚本中定义。

示例代码:

# template variables values
CONTACT_EMAIL="myemail"
CONTACT_NAME="myname"
VARS="CONTACT_EMAIL CONTACT_NAME"

TEMPLATE_FILEPATH="mytemplate.txt"

# template renderer
set -x
SEDARGS=
for VAR in $VARS; do
     SEDARGS+=" -e \"s,@$VAR@,${!VAR},\""
done
sed -r $SEDARGS $TEMPLATE_FILEPATH

由于“set -x”而由shell执行并打印的sed命令:

+ sed -r -e '"s,@CONTACT_EMAIL@,myemail,"' -e '"s,@CONTACT_NAME@,myname,"' mytemplate.txt 

sed 输出:

sed: -e expression #1, char 1: unknown command: `"'

我知道每个 sed 表达式周围的单引号会导致这个不直观的错误消息,但我不知道为什么要添加它们。

怎么了?

【问题讨论】:

标签: bash sed


【解决方案1】:

您在 SEDARGS 变量中嵌入了引号。执行命令时不会删除这些。要删除它们,您需要再次调用解释器,您可以使用eval 执行此操作。例如:

eval sed -r $SEDARGS $TEMPLATE_FILEPATH

您可能需要更多地解决这个问题(添加引号等)。

【讨论】:

  • 成功了,谢谢!这是非常棘手的。我假设Linux shell首先解析引号然后执行变量替换?
  • 是的。它必须按此顺序执行,否则单引号不会停止变量扩展。
【解决方案2】:

单引号不是实际参数的一部分。它们由您的 shell 添加,仅用于由 set -x 引起的输出。

为什么shell会这样做?这样您就可以使用该输出准确地重新运行脚本执行期间执行的内容。正如您正确注意到的那样,需要它们来保护来自SEDARGS content"(即,在您的脚本中转义为\"inner )。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-17
    • 1970-01-01
    • 2021-10-11
    相关资源
    最近更新 更多