You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bash脚本写入JSON文件时出现bad substitution错误求助

解决Bash脚本中的"bad substitution"错误

先来看你的脚本代码:

#!/bin/sh
set -e
cat <<EOF > config.json
{
  "host": "READER",
  "server-url": "${server.url}",
  "port": 8080,
}
EOF

执行时遇到的错误:

line 5: ..... : bad substitution

错误含义

"bad substitution"是Bash给你的直白提示:它没法解析你写的变量替换语法,也就是${server.url}这个写法不符合Bash的变量规则,直接导致脚本执行卡壳。

为什么会出现这个问题?

核心根源是Bash不允许变量名里带点号(.)。Bash的变量命名有严格规则:只能用字母(大小写都行)、数字和下划线(_),而且开头必须是字母或下划线,点号属于非法字符。

你说执行echo $server.url能正常输出,其实这是个误会——Bash解析$server.url时,只会把$server当成变量,后面的.url会被当作普通字符串直接拼上去。如果server变量是空的,输出就是.url;如果server有值,就是server的值.url。你以为是server.url变量生效了,但实际上Bash根本没创建这个名字的变量,它只认server这个合法的变量名。

哪怕你把脚本开头换成#!/bin/bash,这个命名规则也不会变,所以问题自然得不到解决。

解决方法

最安全、规范的做法是修改变量名,把点号换成下划线:

  1. 重新设置变量:
server_url="你的服务器地址"
export server_url
  1. 修改脚本里的变量引用:
#!/bin/bash
set -e
cat <<EOF > config.json
{
  "host": "READER",
  "server-url": "${server_url}",
  "port": 8080
}
EOF

(顺便提一句:JSON里最后一个键值对后面别加逗号,不然会导致JSON格式错误,很多解析器会报错)

如果因为特殊原因必须保留带点号的变量名(比如这个变量是外部程序传入的环境变量),可以用eval间接获取,但这种方式有安全风险(如果变量值包含特殊字符,可能触发脚本注入),非必要不推荐:

"server-url": "$(eval echo \${server.url})",

内容的提问来源于stack exchange,提问作者D.Rees

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 03:59:55