在 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":"A
和 Test"}
)。如果 JSON_DATA
包含通配元字符,则会导致文件名扩展。
要修复它,请引用它:
'{"data":"'"$JSON_DATA"'"}'
注意交替使用单引号和双引号。这将扩展为一个单词:
{"data":"A Test"}
这是a more detailed answer我前段时间写过,其中还提到了另一个方便的选项,即使用此处文档。
关于json - 当变量中的 JSON 数据包含空格时,cURL 抛出通配错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44996476/