Bash脚本curl命令JSON变量无法识别问题求助
解决Bash脚本中curl JSON数据里变量无法解析的问题
问题核心
Bash中单引号包裹的内容会被当作纯字面量,不会解析其中的变量(比如$message),这就是你原命令里变量无法识别的根本原因。
三种可行解决方案
方案1:外层双引号+内部双引号转义
将包裹JSON的单引号换成双引号,同时对JSON内部的双引号用反斜杠\转义,既让Bash解析变量,又能保留JSON格式:
message="test" curl -XPOST -d "{\"msgtype\":\"m.text\", \"body\":\"$message\"}" "$curlurl"
注意:
$curlurl也建议用双引号包裹,避免变量包含空格或特殊字符时出现错误。
方案2:使用Here-doc传递数据
用Here-doc方式传递JSON,可读性更强,无需大量转义:
message="test" curl -XPOST -d @- "$curlurl" <<EOF {"msgtype":"m.text", "body":"$message"} EOF
这里@-表示curl从标准输入读取数据,EOF未被单引号包裹时,Bash会自动解析其中的$message变量,JSON的双引号直接保留即可。
方案3:用jq构造合法JSON(推荐复杂场景)
如果$message可能包含特殊字符(比如双引号、换行),手动处理引号容易出错,推荐用jq工具生成标准JSON:
message="test" curl -XPOST -d "$(jq -n --arg msg "$message" '{msgtype:"m.text", body:$msg}')" "$curlurl"
jq会自动处理变量中的特殊字符,确保生成的JSON格式完全合法,避免手动拼接的潜在问题。
内容的提问来源于stack exchange,提问作者bash83376
相关产品推荐
相关产品推荐

