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