Syspass API Bash脚本curl请求JSON参数变量无法识别问题
问题原因
Bash 中单引号包裹的字符串会完全保留字面量,不会执行任何变量展开、命令替换操作,你将完整JSON结构放在单引号中,内部的$开头变量自然会被当做普通字符串传递,不会解析为实际值。如果直接把外层单引号换成双引号,又会和JSON语法要求的内部双引号冲突,导致语法错误。
解决方案
方案1(推荐):使用jq工具生成JSON
jq是专门处理JSON的命令行工具,会自动完成变量注入、特殊字符转义,完全避免手动拼接JSON的格式错误:
- 先安装
jq:各主流发行版软件源均包含,例如Debian/Ubuntu执行apt install jq,CentOS/RHEL执行yum install jq。 - 修改后的脚本如下:
#!/bin/bash token="x" tokenPass="x" name="prueba" url="https://prueba.prueba.prueba" user="prueba" pass="prueba" notes="prueba" # 生成标准JSON结构 json_data=$(jq -n \ --arg token "$token" \ --arg tokenPass "$tokenPass" \ --arg name "$name" \ --arg user "$user" \ --arg url "$url" \ --arg pass "$pass" \ --arg notes "$notes" \ '{ "jsonrpc": "2.0", "method": "account/create", "params": { "authToken": $token, "tokenPass": $tokenPass, "name": $name, "categoryId": "7", "clientId": "9", "login": $user, "url": $url, "pass": $pass, "notes": $notes }, "id": 1 }') # 调用接口 curl -k -H "Content-Type:Application/json" -d "$json_data" -o- https://syspass.prueba.es/api.php
方案2:手动拼接JSON字符串
如果不想安装额外工具,可以通过拆分单双引号的方式拼接,仅在变量部分使用双引号实现展开:
#!/bin/bash token="x" tokenPass="x" name="prueba" url="https://prueba.prueba.prueba" user="prueba" pass="prueba" notes="prueba" curl -k -H "Content-Type:Application/json" -d '{"jsonrpc": "2.0", "method": "account/create", "params": { "authToken": "'"$token"'", "tokenPass": "'"$tokenPass"'", "name": "'"$name"'" , "categoryId": "7", "clientId": "9","login":"'"$user"'","url": "'"$url"'" ,"pass": "'"$pass"'","notes": "'"$notes"'"}, "id": 1}' -o- https://syspass.prueba.es/api.php
注意:该方案不会自动处理变量中的特殊字符,如果变量值包含双引号、换行、反斜杠等字符,会直接破坏JSON结构导致请求失败,仅适合变量值为纯普通字符的场景使用。
内容的提问来源于stack exchange,提问作者forzax hx
相关产品推荐
相关产品推荐

