当无关紧要时,最好的报价是什么?

时间:2011-07-07 13:51:46

标签: bash

如果我想要这样的话:

foo="bar baz"
foo='bar baz'

使用双引号或单引号是最佳做法吗?

4 个答案:

答案 0 :(得分:6)

这通常依赖:

  • 单引号不能包含其他单引号,也无法转义它们。因此,它们只能用于“简单”文本。
  • 双引号支持大括号扩展(echo "${USER} uses ${LANG#*.} encoding")等有用的东西,但不能在其中包含转义序列。这意味着您通常无法看到例如"[space][tab]""[tab]"字符串之间的差异。
  • Dollar-single引用的字符串很像双引号字符串,但可以包含控制字符。我个人最喜欢的单元测试:

    $ echo -n $'--$`!*@\a\b\E\f\r\t\v\\\'"\360\240\202\211 \n' | uniname -bcepu
    glyph   name
    -      HYPHEN-MINUS
    -      HYPHEN-MINUS
    $      DOLLAR SIGN
    `      GRAVE ACCENT
    !      EXCLAMATION MARK
    *      ASTERISK
    @      COMMERCIAL AT
            BELL
            BACKSPACE
            ESCAPE
            FORM FEED (FF)
            CARRIAGE RETURN (CR)
            CHARACTER TABULATION
            LINE TABULATION
    \      REVERSE SOLIDUS
    '      APOSTROPHE
    "      QUOTATION MARK
          Unknown character in range CJK Unified Ideographs Extension B
            SPACE
            LINE FEED (LF)
    

如果您想知道是否应该对变量使用$'引用,请尝试将其发送到printf %q

$ var=foo
$ printf %q "$var"
foo
$ var="foo
> bar"
$ printf %q "$var"
$'foo\nbar'

答案 1 :(得分:5)

我倾向于使用双引号,除非我真的需要使用单引号来停止变量插值或其他原因。

也许这是我在使用双引号而不是单引号等Pascal,Fortran和Basic等语言成长的过程中的一部分。但是,由于您在BASH中使用的大多数字符串都会进行变量插值,因此您可能习惯使用双引号而不是在语句中是否需要双引号或单引号。你也可以改变:

foo='Thank you!'

现在,但是当你修改它时:

foo='Thank you, $name!'

你不必也记得编辑引号,而你就是这样。

在您实际需要单引号的少数情况下,您可以轻松地从心理上转移。

答案 2 :(得分:1)

什么时候无关紧要,没关系。虽然一致性很好,但请选择您喜欢的一个并在您自己的代码中一致地使用它。

答案 3 :(得分:0)

有一个微观效率论证支持单引号,因为shell不必检查引用以查看是否需要插入任何内容。

例如,在Perl中,对任何文字字符串使用单引号有时会被视为best practice