当变量中的JSON数据包含空格时,cURL抛出globbing错误

时间:2017-07-09 12:38:40

标签: 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没有?

非常感谢,史蒂夫。

1 个答案:

答案 0 :(得分:4)

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

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

无法正常工作,因为它被bash扩展为两个字:

{"data":"A Test"}

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

要修复它,请引用它:

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

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

{"data":"A Test"}

我在前一段时间写过的a more detailed answer还提到了另一个方便的选项,即使用here-document。