V 友们 wget/ curl 后面的 URL 含特殊字符,该加单引号还是双引号?

2021-12-23 11:46:26 +08:00
 notgoda
查资料 看到 curl 标准用法是双引号, wget 也是这样吗?我看好像都有人使用。
1691 次点击
所在节点    问与答
14 条回复
BeijingBaby
2021-12-23 11:51:32 +08:00
添加 \ 万能的
notgoda
2021-12-23 11:55:18 +08:00
@BeijingBaby 谢谢. 有时候碰到地址比较长,要一个一个看有点麻烦。 就是这个引号看到的资料说法都不一样。
ysc3839
2021-12-23 12:04:41 +08:00
跟 curl 或 wget 无关,跟 shell 以及操作系统有关
notgoda
2021-12-23 12:08:33 +08:00
@ysc3839
@ysc3839 大佬,请问什么 shell 及 OS 下用单引号呢? 🙏
yzwduck
2021-12-23 12:08:37 +08:00
TL;DR: 对 URL 用单引号。
单引号不会对字符串里的任何特殊字符作转义,但字符串里不能出现单引号。
双引号会对字符串里的特殊字符作转义。

具体规定请参阅 https://pubs.opengroup.org/onlinepubs/9699919799/xrat/V4_xcu_chap02.html 里 quote 相关内容。
reallittoma
2021-12-23 12:09:49 +08:00
现在大部分 shell 都支持两种引号吧,只要成对就行了
notgoda
2021-12-23 12:21:59 +08:00
@yzwduck 谢谢 🙏 所以如果用双引号的话,然后里面的特殊字符还得加上反斜杠 \ ? 用单引号就没这个问题。但是 如果同一行代码中其他命令 也用了单引号, 如何避免冲突呢?@reallittoma
notgoda
2021-12-23 12:23:21 +08:00
@reallittoma 谢谢回复。肯定是成对。但是 如果同一行代码中其他命令 也用了单引号, 如何避免冲突呢?
AoEiuV020CN
2021-12-23 12:25:01 +08:00
windows cmd 就压根不支持单引号,用了直接当成地址的一部分,
linux shell 支持单引号又引号,不过合法 url 没有什么特殊字符需要反斜杠 \ 转义的吧,
ysc3839
2021-12-23 12:38:02 +08:00
@notgoda 首先要知道 Unix 和 Windows 命令行参数的区别,前者传递的是字符串数组,后者只是一个字符串。因此,在 Unix 下,是由 shell 把单个命令行字符串解析成字符串数组,再传递给程序的。至于 shell 的解析规则,可以看看楼上。
Windows 下传递的只是字符串,那为什么 C/C++程序仍然能拿到字符串数组形式的 argv 呢?那是因为 C 运行库自己解析了。其实在 Windows 下具体解析规则是跟程序有关的,不过大部分程序都会用 C 库或者系统提供的解析算法,规则是统一的,一般可以认为跟程序无关。
不过 Windows 这样的情况有坑,调用方需要把带引号等特殊符号的参数 escape 后传过去,很容易写出 bug 甚至安全漏洞。一个典型的例子是让用户输入路径然后通过参数传给某个程序,如果路径末尾是一个反斜杠,加上引号后会变成\",会被认为是引号的转义,导致问题。
kidonng
2021-12-23 12:42:55 +08:00
用双引号是因为一般还是需要 expand 引号里的变量的,如果 URL 里有不代表变量的 $ 才用单引号
reallittoma
2021-12-23 13:59:17 +08:00
@notgoda #8 很简单,如果字符串中包含单引号,那就用双引号把整个字符串包起来,反过来也一样。
举例:
```
> echo 'hello" world'
输出:hello" world
> echo "hello' world"
输出:hello' world
```
kernelpanic
2021-12-23 14:06:05 +08:00
Windows 会解析单引号之间的内容,Linux 会解析双引号之间的内容,如果你想把一个字符串整个传给程序,Windows 上就用双引号括起来,Linux 上用单引号。如果要传递的字符串本身包含单引号或者双引号就用\转义
notgoda
2021-12-23 14:23:17 +08:00
谢谢楼上各位老铁。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/823941

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX