首页 文章

Bash中单引号和双引号之间的区别

提问于
浏览
377

在Bash中,单引号( '' )和双引号( "" )之间有什么区别?

5 回答

  • 190

    单引号不会插入任何内容,但双引号会 . 例如:变量,反引号,某些 \ 转义等 .

    例:

    $ echo "$(echo "upg")"
    upg
    $ echo '$(echo "upg")'
    $(echo "upg")
    

    Bash手册有这样的说法:

    3.1.2.2单引号用单引号(')括起字符可保留引号中每个字符的字面值 . 单引号之间可能不会出现单引号,即使前面有反斜杠也是如此 . 3.1.2.3双引号用双引号括起来的字符(“)保留引号内所有字符的字面值,但$,,\除外,并且,当启用历史扩展时,! . 字符$和retain它们在双引号内的特殊含义(参见Shell Expansions) . 反斜杠只有在跟随以下字符之一时才保留其特殊含义:$,`,“,\或newline . 在双引号内,将删除后跟其中一个字符的反斜杠 . 没有特殊含义的字符前面的反斜杠保持不变 . 双引号可以在双引号内引用,前面加一个反斜杠 . 如果启用,将执行历史记录扩展,除非!出现在双引号中的是使用反斜杠转义的 . 之前的反斜杠!没有删除 . 在双引号中,特殊参数*和@具有特殊含义(请参见壳参数扩展) .

  • 4

    accepted answer很棒 . 我正在制作一个有助于快速理解该主题的表格 . 解释涉及一个简单的变量 a 以及一个索引数组 arr .

    如果我们设定

    a=apple      # a simple variable
    arr=(apple)  # an indexed array with a single element
    

    然后 echo 第二列中的表达式,我们将得到第三列中显示的结果/行为 . 第四列解释了这种行为 .

    # | Expression  | Result      | Comments
    ---+-------------+-------------+--------------------------------------------------------------------
     1 | "$a"        | apple       | variables are expanded inside ""
     2 | '$a'        | $a          | variables are not expanded inside ''
     3 | "'$a'"      | 'apple'     | '' has no special meaning inside ""
     4 | '"$a"'      | "$a"        | "" is treated literally inside ''
     5 | '\''        | **invalid** | can not escape a ' within ''; use "'" or $'\'' (ANSI-C quoting)
     6 | "red$arocks"| red         | $arocks does not expand $a; use ${a}rocks to preserve $a
     7 | "redapple$" | redapple$   | $ followed by no variable name evaluates to $
     8 | '\"'        | \"          | \ has no special meaning inside ''
     9 | "\'"        | \'          | \' is interpreted inside "" but has no significance for '
    10 | "\""        | "           | \" is interpreted inside ""
    11 | "*"         | *           | glob does not work inside "" or ''
    12 | "\t\n"      | \t\n        | \t and \n have no special meaning inside "" or ''; use ANSI-C quoting
    13 | "`echo hi`" | hi          | `` and $() are evaluated inside ""
    14 | '`echo hi`' | `echo hi`   | `` and $() are not evaluated inside ''
    15 | '${arr[0]}' | ${arr[0]}   | array access not possible inside ''
    16 | "${arr[0]}" | apple       | array access works inside ""
    17 | $'$a\''     | $a'         | single quotes can be escaped inside ANSI-C quoting
    18 | "$'\t'"     | $'\t'       | ANSI quoting is not interpreted inside ""
    19 | '!cmd'      | !cmd        | history expansion character '!' is ignored inside ''
    20 | "!cmd"      | cmd args    | expands to the most recent command matching "cmd"
    ---+-------------+-------------+--------------------------------------------------------------------
    

    也可以看看:

  • 396

    其他人解释得非常好,只想给出简单的例子 .

    Single quotes 可以在文本周围使用,以防止shell解释任何特殊字符 . 当用单引号括起来时,美元符号,空格,&符号,星号和其他特殊字符都会被忽略 .

    $ echo 'All sorts of things are ignored in single quotes, like $ & * ; |.'
    

    它会给出这样的:

    All sorts of things are ignored in single quotes, like $ & * ; |.
    

    唯一不能放在单引号内的是单引号 .

    Double quotes 与单引号类似,除了双引号仍然允许shell解释美元符号,后引号和反斜杠 . 众所周知,反斜杠可以防止解释单个特殊字符 . 如果需要将美元符号用作文本而不是变量,则在双引号内这可能很有用 . 它还允许对双引号进行转义,因此它们不会被解释为带引号的字符串的结尾 .

    $ echo "Here's how we can use single ' and double \" quotes within double quotes"
    

    它会给出这样的:

    Here's how we can use single ' and double " quotes within double quotes
    

    还可以注意到,撇号(否则将被解释为带引号的字符串的开头)在双引号内被忽略 . 但是,变量被解释并用双引号内的值替换 .

    $ echo "The current Oracle SID is $ORACLE_SID"
    

    它会给出这样的:

    The current Oracle SID is test
    

    Back quotes 完全不同于单引号或双引号 . 后引号实际上强制执行它们所包含的命令,而不是用于防止特殊字符的解释 . 执行所附的命令后,将替换它们的输出以代替原始行中的后引号 . 通过一个例子,这将更加清晰 .

    $ today=`date '+%A, %B %d, %Y'`
    $ echo $today
    

    它会给出这样的:

    Monday, September 28, 2015
    
  • 152

    ' '" " 的用法有明显的区别 .

    ' ' 用于任何事物时,没有"transformation or translation"完成 . 它是按原样打印的 .

    随着 " " ,无论它包围什么,它的值都是"translated or transformed" .

    通过翻译/转换,我的意思是:单引号内的任何内容都不会是"translated"到它们的值 . 它们将被引用,因为它们在引号内 . 示例: a=23 ,然后 echo '$a' 将在标准输出上生成 $a . 而 echo "$a" 将在标准输出上产生 23 .

  • 0

    如果您指的是当您回显某些内容时会发生什么,单引号将逐字回显它们之间的内容,而双引号将评估它们之间的变量并输出变量的值 .

    例如,这个

    #!/bin/sh
    MYVAR=sometext
    echo "double quotes gives you $MYVAR"
    echo 'single quotes gives you $MYVAR'
    

    会给这个:

    double quotes gives you sometext
    single quotes gives you $MYVAR
    

相关问题