V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
notgoda
V2EX  ›  问与答

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

  •  
  •   notgoda · 153 天前 via iPhone · 825 次点击
    这是一个创建于 153 天前的主题,其中的信息可能已经有所发展或是发生改变。
    查资料 看到 curl 标准用法是双引号, wget 也是这样吗?我看好像都有人使用。
    14 条回复    2021-12-23 14:23:17 +08:00
    BeijingBaby
        1
    BeijingBaby  
       153 天前
    添加 \ 万能的
    notgoda
        2
    notgoda  
    OP
       153 天前 via iPhone
    @BeijingBaby 谢谢. 有时候碰到地址比较长,要一个一个看有点麻烦。 就是这个引号看到的资料说法都不一样。
    ysc3839
        3
    ysc3839  
       153 天前 via Android   ❤️ 1
    跟 curl 或 wget 无关,跟 shell 以及操作系统有关
    notgoda
        4
    notgoda  
    OP
       153 天前 via iPhone
    @ysc3839
    @ysc3839 大佬,请问什么 shell 及 OS 下用单引号呢? 🙏
    yzwduck
        5
    yzwduck  
       153 天前   ❤️ 1
    TL;DR: 对 URL 用单引号。
    单引号不会对字符串里的任何特殊字符作转义,但字符串里不能出现单引号。
    双引号会对字符串里的特殊字符作转义。

    具体规定请参阅 https://pubs.opengroup.org/onlinepubs/9699919799/xrat/V4_xcu_chap02.html 里 quote 相关内容。
    reallittoma
        6
    reallittoma  
       153 天前
    现在大部分 shell 都支持两种引号吧,只要成对就行了
    notgoda
        7
    notgoda  
    OP
       153 天前 via iPhone
    @yzwduck 谢谢 🙏 所以如果用双引号的话,然后里面的特殊字符还得加上反斜杠 \ ? 用单引号就没这个问题。但是 如果同一行代码中其他命令 也用了单引号, 如何避免冲突呢?@reallittoma
    notgoda
        8
    notgoda  
    OP
       153 天前 via iPhone
    @reallittoma 谢谢回复。肯定是成对。但是 如果同一行代码中其他命令 也用了单引号, 如何避免冲突呢?
    AoEiuV020CN
        9
    AoEiuV020CN  
       153 天前
    windows cmd 就压根不支持单引号,用了直接当成地址的一部分,
    linux shell 支持单引号又引号,不过合法 url 没有什么特殊字符需要反斜杠 \ 转义的吧,
    ysc3839
        10
    ysc3839  
       153 天前 via Android
    @notgoda 首先要知道 Unix 和 Windows 命令行参数的区别,前者传递的是字符串数组,后者只是一个字符串。因此,在 Unix 下,是由 shell 把单个命令行字符串解析成字符串数组,再传递给程序的。至于 shell 的解析规则,可以看看楼上。
    Windows 下传递的只是字符串,那为什么 C/C++程序仍然能拿到字符串数组形式的 argv 呢?那是因为 C 运行库自己解析了。其实在 Windows 下具体解析规则是跟程序有关的,不过大部分程序都会用 C 库或者系统提供的解析算法,规则是统一的,一般可以认为跟程序无关。
    不过 Windows 这样的情况有坑,调用方需要把带引号等特殊符号的参数 escape 后传过去,很容易写出 bug 甚至安全漏洞。一个典型的例子是让用户输入路径然后通过参数传给某个程序,如果路径末尾是一个反斜杠,加上引号后会变成\",会被认为是引号的转义,导致问题。
    kidonng
        11
    kidonng  
       153 天前 via Android
    用双引号是因为一般还是需要 expand 引号里的变量的,如果 URL 里有不代表变量的 $ 才用单引号
    reallittoma
        12
    reallittoma  
       153 天前
    @notgoda #8 很简单,如果字符串中包含单引号,那就用双引号把整个字符串包起来,反过来也一样。
    举例:
    ```
    > echo 'hello" world'
    输出:hello" world
    > echo "hello' world"
    输出:hello' world
    ```
    kernelpanic
        13
    kernelpanic  
       153 天前
    Windows 会解析单引号之间的内容,Linux 会解析双引号之间的内容,如果你想把一个字符串整个传给程序,Windows 上就用双引号括起来,Linux 上用单引号。如果要传递的字符串本身包含单引号或者双引号就用\转义
    notgoda
        14
    notgoda  
    OP
       153 天前 via iPhone
    谢谢楼上各位老铁。
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   3943 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 37ms · UTC 09:36 · PVG 17:36 · LAX 02:36 · JFK 05:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.