是否有 bash 选项或其他方式使 bash 仅扩展大括号变量 like${var}
并忽略常规变量 like $var
?
更新 - 这就是我想要的原因:我有一个用纯 bash 编写的相对较大的程序,它必须保留在纯 bash 中(它是一个设计用于在大多数 Linux 发行版上运行的安装程序,我们不想添加额外的依赖项)。它有一个用 bash 编写的非常简单的模板引擎。这是模板解析代码(全部):
function apply_template() {
local src=$1
local dst=$2
local code="
cat<<EOF
$(cat $src)
EOF
"
eval "$code" > $dst
}
它非常简单但非常有效。我们有 30 个使用此代码评估的模板。这是一个例子:
[ {
"host" : "${primary_node_ip}",
"access" : {
"type" : "ssh",
"user" : "${user}",
"key" : "id_rsa"
} ]
Bash用值替换变量,一切都很好。
当我们的模板具有不应被视为变量的“$”符号时,就会出现问题,例如 nginx 配置。如果事实上它只发生在一个模板中,那就是一个 nginx conf。
完美的解决方案是在我的“apply_template”函数中启用这个(我现在知道不存在)模式。
不,那里没有。变量扩展在手册3.5.3 Shell 参数扩展中进行了描述
如果你真的需要这个
$
标识符之前的所有内容,中间没有标点符号。假设您有一些 JSON 模板,类似于您在问题中显示的内容:
里面看起来像 shell 变量的东西实际上是内部变量,我们可以在JSON 工具
jq
的命令行上为其赋值。jq
这样做会另外对值进行适当的编码以包含在 JSON 文档中:上面的命令将为文档中使用的变量赋值。一些变量被分配了变量值,并且
$comment
变量被分配了带有嵌入引号的多行文本。该
-n
选项停止jq
从文件或输入流中读取额外的输入。相反,它将在通过-f
选项提供的模板文件中生成表达式的结果。输出(示例):
该
jq
工具适用于我所知道的所有 Linux 发行版,以及所有其他当前的 Unix 变体。