如何在bash中插入引号而不在其文字文本内进行变量扩展?

时间:2019-02-19 20:02:19

标签: linux shell

我有如下代码:

read var9
echo 'option domain-name' '"'$var9'"'';' >>dhcpd.conf

我希望输出看起来像:

option domain-name "sr.lan";

但是编辑器中语法高亮显示的$var1突出显示为好像是文字文本,而不是变量引用,如下图所示。

这怎么了?

这是我的脚本的图片: My script

2 个答案:

答案 0 :(得分:1)

您可以尝试以下解决方案之一:

  • echo 'option domain-name "'"$var9"'";' >> dhcpd.conf
  • echo "option domain-name \"$var9\";" >> dhcpd.conf
  • printf 'option domain-name "%s";' "$var9" >> dhcpd.conf

但是,我宁愿建议使用预定义的模板(分隔的文件),并用sedperlmustache替换相关的变量出现,而不是这样做类似于echo ... $var9 ... >> dhcpd.conf

例如,使用胡子的Bash实现mo

# Create demo file
cat > demo.mo <<EOF
option routers {{var1}};
option domain-name "{{var9}}";
EOF

# Install mustache for Bash
curl -fsSL https://git.io/get-mo -o mo
# inspect the bash script "mo" so downloaded,
# then add the executable flag
chmod +x mo
# and put "mo" in your PATH, e.g.: sudo mv mo /usr/local/bin/

# Use mustache
var1="Démo_var_1" var9="Démo var 9" mo demo.mo > demo.txt

然后您获得:

  

demo.txt

option routers Démo_var_1;
option domain-name "Démo var 9";

PyPI中还有一个Python版本:pystache

但是,当然,有许多提供类似功能的开源程序。

例如,如@CharlesDuffy所提到的,envsubst程序也可以使用,仅依赖于gettext,例如这些参考:

答案 1 :(得分:0)

就其价值而言,如果您的编辑器显示$var9部分就像被引用一样,则似乎将引号解释为错误。您的行有四个不同的带引号的字符串,在下面标记。请注意,变量$var9没有被引用。但是,您应该对变量加双引号,以避免出现word splitting问题以及文件名通配符意外扩展。

echo 'option domain-name' '"'$var9'"'';' >>dhcpd.conf
     11111111111111111111-222-----333444

ErikMD's answer具有引号正确且可读性强的替代方法。