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

Shell脚本中curl命令无法识别$1、$2参数的问题求助

解决Shell脚本中curl JSON参数不解析变量的问题

这问题我熟!你遇到的核心是Shell里单引号和双引号的变量解析规则——单引号会把内部所有内容当作纯字符串,完全不解析变量,所以$1、$2根本不会被替换成脚本传入的参数;但直接去掉单引号的话,JSON里的双引号又会被Shell当成命令分隔符,导致语法报错。下面给你几个实用的解决办法,按推荐程度排序:

1. 用jq工具生成JSON(最健壮,推荐)

如果你的系统能安装jq工具(大部分Linux发行版可以通过apt install jq或yum install jq安装),这是最优解,它能帮你自动处理参数里的特殊字符(比如引号、空格、反斜杠),生成完全合法的JSON:

#!/bin/bash
echo "First arg: $1"
echo "Second arg: $2"
curl -w "\n" -d "$(jq -n --arg ssid "$1" --arg psk "$2" '{ssid: $ssid, psk: $psk}')" \
-H "Content-Type: application/json" \
-X POST localhost:8080/connect

原理:jq通过--arg参数接收Shell变量,然后生成标准的JSON字符串,完全避免手动拼接JSON的各种坑。

2. 转义JSON双引号,用双引号包裹数据

如果不想装额外工具,可以手动转义JSON里的双引号,用双引号包裹整个-d参数的内容,这样Shell会解析内部的$1、$2,同时转义的双引号会保留在最终的JSON里:

#!/bin/bash
echo "First arg: $1"
echo "Second arg: $2"
curl -w "\n" -d "{\"ssid\": \"$1\", \"psk\": \"$2\" }" \
-H "Content-Type: application/json" \
-X POST localhost:8080/connect

注意:如果你的参数里包含双引号或者反斜杠,这种方法可能会失效,适合参数内容简单的场景。

3. 使用Here-doc构造JSON

Here-doc的写法更清晰,不需要转义双引号,可读性更好,适合JSON结构稍复杂的情况:

#!/bin/bash
echo "First arg: $1"
echo "Second arg: $2"
curl -w "\n" -H "Content-Type: application/json" -X POST localhost:8080/connect <<EOF
{"ssid": "$1", "psk": "$2"}
EOF

原理:EOF之间的内容会被Shell当作字符串处理,自动解析变量,同时双引号直接保留,不需要转义。

内容的提问来源于stack exchange,提问作者Fredrik Gisslén

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:28:04