gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 18:15:20 26 4
gpt4 key购买 nike

在 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com