我有一个 shell 脚本,其中一部分是以下 JSON:
curl --request POST \
--url 'https://'$jira_instance'.atlassian.net/rest/api/2/field/'$field_ID'/context/'$context_ID'/option' \
--user $jira_user'@whatever.com:'$api_token \
--header 'Accept: application/json' \
--header 'Content-Type: application/json' \
--data '{
"options": [
{
"disabled": false,
"value": "'$1'"
}
]
}'
仅当 $1 不包含空格时才有效。
如果 $1 包含任何空格,那么我会收到以下错误,告诉我 cURL 正在损坏:
curl: (3) URL 位置 11 中不匹配的右大括号/中括号:
我也尝试过在双引号内使用双引号(““$1”),但这根本没有任何作用。
好心提醒。
通常,要在 Bash 中正确引用单引号内的变量,请使用
'"$var"'
(单引号后跟双引号)。第一个单引号结束单引号字符串,然后是双引号变量,第二个单引号重新开始单引号字符串。如果没有双引号,参数扩展会受到分词的影响,空格会将文本拆分为多个参数传递给curl,导致它将第二个参数视为要获取的URL。
鉴于您的示例,您应该这样做:
Bash 删除了多余的引号,因此如果
$1
是,比如说,,one two
最终输出将如下所示:(请注意,变量值不能包含双引号,或者必须对其进行正确转义。)
您面临的直接问题是引用。第一个单引号结束构成 选项参数
"value": "'$1'"
的单引号字符串。这使得 shell 将选项参数拆分为值中的任何空格(并对每个生成的字符串应用文件名通配)。--data
curl
$1
相反,不要将 shell 变量注入 JSON 文档。否则,您将遇到包含双引号和文字换行符或制表符的字符串的问题。
使用 JSON 感知工具(例如
jq
. 该jq
实用程序知道如何正确编码 shell 字符串以在 JSON 文档中使用。下面创建一个 shell 变量 ,
payload
它保存将与 一起使用的 JSON 文档curl
。或者,
然后将其与以下命令一起使用
--data
:(请注意上述命令中更正引用的其他实例!)
如果
$1
设置为单个字符串那么这将在 中生成以下格式良好的 JSON 文档
$payload
: