CURL转义单引号

70

我该如何让这个起作用呢?

curl -XPOST 'http://localhost:9290/location/place' -d '{"geoloc": {"lat": "38.1899", "lon": "-76.5087"}, "longitude": "-76.5087", "admin_name1": "Maryland", "admin_name2": "St. Mary's", "admin_name3": "", "postal_code": "20692", "admin_code3": "", "country_code": "US", "admin_code1": "MD", "latitude": "38.1899", "admin_code2": "037", "accuracy": null, "place_name": "Valley Lee"}'
Mary's 中的 ' 导致了这个失败。我像这样从文件中运行它 cat curl-cmd.txt | sh,但在命令行中也无法正常工作。我尝试使用 \'\\'\u0027(Unicode 的 '),但都没有成功。

我被卡住了。


https://dev59.com/t2Ml5IYBdhLWcg3wMUeP#18612754 - Mihai
1
没错,就像我在问题中所说的那样,我已经尝试过了。 - mikeb
2个回答

158

我有同样的问题。最简单的解决方法是在单引号外加上反斜杠来转义撇号'\''

对于您的用例,将Mary's更改为Mary'\''s即可。

curl -XPOST 'http://localhost:9290/location/place' -d '{"geoloc": {"lat": "38.1899", "lon": "-76.5087"}, "longitude": "-76.5087", "admin_name1": "Maryland", "admin_name2": "St. Mary'\''s", "admin_name3": "", "postal_code": "20692", "admin_code3": "", "country_code": "US", "admin_code1": "MD", "latitude": "38.1899", "admin_code2": "037", "accuracy": null, "place_name": "Valley Lee"}'

另一种方法是使用双引号将POST数据(-d)包裹起来,并在JSON字符串中转义所有嵌套的双引号。

curl -XPOST 'http://localhost:9290/location/place' -d "{\"geoloc\": {\"lat\": \"38.1899\", \"lon\": \"-76.5087\"}, \"longitude\": \"-76.5087\", \"admin_name1\": \"Maryland\", \"admin_name2\": \"St. Mary's\", \"admin_name3\": \"\", \"postal_code\": \"20692\", \"admin_code3\": \"\", \"country_code\": \"US\", \"admin_code1\": \"MD\", \"latitude\": \"38.1899\", \"admin_code2\": \"037\", \"accuracy\": null, \"place_name\": \"Valley Lee\"}"

1
由于某种原因,我需要您疯狂的解决方案来从PHP的shell_exec()中调用curl,即使我正在使用--data-urlencode。也许这与Linux在将字符串传递给curl之前处理字符串的方式有关?不确定。 - PJ Brunet
第一种解决方案在我的Mac控制台上不起作用,它产生的效果与根本没有转义一样。 - Slobodan Antonijević
1
@PJBrunet - 我猜想是Shell在命令行上执行字符串连接操作。(例如 echo 'hello'\''world' -> hello'world - Travis Clarke
当单引号在变量中且该变量是post的输入时,我们如何解析单引号。 - Sunil Agarwal
对我来说,如果第一个参数(例如-XPOST)有单引号,而第二个参数(例如-d)有双引号,则无法正常工作。我不得不一致地将所有参数更改为双引号。 - Michael Freidgeim
显示剩余3条评论

15

经验法则如果你想在bash中显式表示单引号或双引号,请根据字符串包装器(应该是相同的类型)使用反斜杠(\。反斜杠(\)字符用于转义否则具有特殊含义的字符,例如换行符、反斜杠本身或引号字符。

示例

- 双引号示例 - Use \"

如果您想在bash上打印She said "Yes I Do",请使用此方法。

echo "She said \"Yes I Do\""
#output:
She said "Yes I Do"

echo 'she said "Yes I Do"' 
#output:
She said "Yes I Do"

-单引号示例 - 使用'\''

如果您想在bash中打印 My Daughter's dog likes cat treats

echo "My Daughter's dog likes cat treats"
#output:
My Daughter's dog likes cat treats

echo 'My Daughter'\''s dog likes cat treats' 
#output:
My Daughter's dog likes cat treats

如何解释三个单引号(')的用法以及为什么 ' 不起作用? - pdem

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接