在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没有?
非常感谢,史蒂夫。
答案 0 :(得分:4)
您应引用变量以防止shell进行单词拆分。你的第二个例子:
'{"data":"'$JSON_DATA'"}'
无法正常工作,因为它被bash
扩展为两个字:
{"data":"A Test"}
所以-d
选项会收到2个参数({"data":"A
和Test"}
)。如果JSON_DATA
包含globbing元字符,则会导致文件名扩展。
要修复它,请引用它:
'{"data":"'"$JSON_DATA"'"}'
注意使用交替的单引号和双引号。这将扩展为一个单词:
{"data":"A Test"}
我在前一段时间写过的a more detailed answer还提到了另一个方便的选项,即使用here-document。