json - 当变量中的 JSON 数据包含空格时,cURL 抛出通配错误

标签 json bash curl

在 Ubuntu 16.04.2 LTS 上使用 bash v4.3.48(1) 并在 macOS Sierra 10.12.5 上使用 bash v3.2.57 我有以下代码,它 POST 存储在变量中的 JSON 数据:

#1    
JSON_DATA="Test"; \
curl -X POST "https://www.techotaku.com/json.php" \
    -H "Content-Type: application/json" \
    -d '{"data":"'$JSON_DATA'"}'

这将返回:

Array
(
    [data] => Test
)

但是,如果 $JSON_DATA 包含空格...

#2
JSON_DATA="A Test"; \
curl -X POST "https://www.techotaku.com/json.php" \
    -H "Content-Type: application/json" \
    -d '{"data":"'$JSON_DATA'"}'

...它抛出一个错误:

curl: (3) [globbing] unmatched close brace/bracket in column 6

我认为这可能是由于错误使用引号造成的,但如果我回显 JSON 数据...

echo '{"data":"'$JSON_DATA'"}'

...它看起来格式良好:

{"data":"A Test"}

此外,如果我将 JSON 数据作为字符串而不是变量包含在内,它就可以工作。

#3
curl -X POST "https://www.techotaku.com/json.php" \
    -H "Content-Type: application/json" \
    -d '{"data":"A Test"}'

如果变量包含空格,我可以让它工作的唯一方法是将 JSON 数据括在双引号中并转义字符串中的文字双引号:

#4    
JSON_DATA="A Test"; \
curl -X POST "https://www.techotaku.com/json.php" \
    -H "Content-Type: application/json" \
    -d "{\"data\":\"$JSON_DATA\"}"

我本以为所有 4 个示例都会起作用。那么,谁能解释为什么只有示例 1,3 和 4 有效,而示例 2 无效?

非常感谢,史蒂夫。

最佳答案

您应该引用变量以防止 shell 进行分词。你的第二个例子:

'{"data":"'$JSON_DATA'"}'

不起作用,因为它被 bash 扩展为两个单词:

{"data":"A Test"}

so -d 选项接收 2 个参数({"data":"ATest"})。如果 JSON_DATA 包含通配元字符,则会导致文件名扩展。

要修复它,请引用它:

'{"data":"'"$JSON_DATA"'"}'

注意交替使用单引号和双引号。这将扩展为一个单词:

{"data":"A Test"}

这是a more detailed answer我前段时间写过,其中还提到了另一个方便的选项,即使用此处文档。

关于json - 当变量中的 JSON 数据包含空格时,cURL 抛出通配错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44996476/

相关文章:

java - Jackson 模板属性替换

javascript - Safari 显示 JSON 文件的内容而不是下载它们

linux - sed:如何在文本 block 后插入行?

python - rm -rf 不通过 python fork execl 脚本删除目录

php - 使用 PHP 执行 cURL 发送推送通知

c# - asp.net如何反序列化json

javascript - 如何将 JS 对象转换为 JSON

python - 命令 "python --verson"使用 "awk"提取版本号

docker - 如何修复 "SSL certificate problem: self signed certificate in certificate chain"错误?

Ubuntu linux 上的 R 和 SSL/curl : failed SSL connect in R, 但可以在 curl 中使用