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,这个命名规则也不会变,所以问题自然得不到解决。
解决方法
最安全、规范的做法是修改变量名,把点号换成下划线:
- 重新设置变量:
server_url="你的服务器地址" export server_url
- 修改脚本里的变量引用:
#!/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
相关产品推荐
相关产品推荐

