【问题标题】:What is the most aesthetic way to to escape a single quote within a single-quoted string in (ba)sh?在 (bash?
【发布时间】:2025-09-22 12:15:01
【问题描述】:

在我的 (ba)sh 脚本中,例如:

MYVAR='Alice says: "Hello, Bob." But Bob isn't listening.'

这是一个语法错误,因为 isn't 中的 ' 结束了单引号字符串。我知道我可以使用

来解决这个问题
MYVAR='Alice says: "Hello, Bob." But Bob isn'"'"'t listening.'

但这太丑了……我能做些什么呢? sh 不支持

MYVAR='Alice says: "Hello, Bob." But Bob isn\'t listening.'

这是可以容忍的,切换到双引号字符串不是我的选择。

【问题讨论】:

    标签: bash escaping sh quotes


    【解决方案1】:

    不,您不能在 Bash(或 korn shell)中的单引号字符串中嵌入单引号。这是您选择的语言的一个特征。在单引号内没有特殊字符,其中包括\

    这是您的一个解决方案的变体,而且很丑:

     echo 'Alice says: "Hello, Bob." But Bob isn'\''t listening.'
    

    给予:

    Alice says: "Hello, Bob." But Bob isn't listening.
    

    或者使用其他语言,例如 Perl 或 Python。

    【讨论】:

    • @AnsgarWiechers:是的,并且 OP 在问题中给出了“太丑了”。
    • @cdarke 我没有仔细阅读这个问题。道歉。
    【解决方案2】:

    至少在 bash 中支持的非 POSIX 解决方案如下:

    MYVAR=$'Alice says: "Hello, Bob." But Bob isn\'t listening.'
    

    $ 导致转义处理。

    【讨论】:

    • 请注意,这并不能保证在所有 shell 中都有效(bashzsh 支持它,可能还有其他一些。但是 POSIX 标准不需要它。)
    【解决方案3】:

    使用 HEREDOC 是处理此问题的好方法:

    read MYVAR << \EOF
    Alice says: "Hello, Bob." But Bob isn't listening.
    EOF
    

    【讨论】:

      【解决方案4】:

      您还可以使用双引号和转义。我想,这比改变语言更简单:

      MYVAR="Alice says: \"Hello, Bob.\" But Bob isn't listening."
      

      更多关于 bash 中的escaping symbols 的信息。

      【讨论】:

      • "切换到双引号字符串对我来说不是一个选项。"对不起,我错过了。
      【解决方案5】:

      我不确定为什么切换到$'...' 是一种选择,但切换到双引号不是(大概是为了防止某种参数扩展)。但是你不需要双引号整个字符串:

      MYVAR='Alice says: "Hello, Bob." But Bob '"isn't"' listening.'
      

      【讨论】: