bash 中 " " 和 ' ' 的区别

sps*_*sps 5 command-line echo

我想弄清楚“”和“ ”之间有什么区别。

当我将它们与echo它们一起使用时,它们都会给出相同的结果,

sps@sps-Inspiron-N5110:~$ echo Hello    world
Hello world
sps@sps-Inspiron-N5110:~$ echo "Hello   world"
Hello   world
sps@sps-Inspiron-N5110:~$ echo 'Hello   world'
Hello   world
sps@sps-Inspiron-N5110:~$ 
Run Code Online (Sandbox Code Playgroud)

是否有任何特定情况我们需要使用其中一个?

谢谢。

Eli*_*gan 6

bash(Ubuntu 的默认交互式shell)中,开单引号 ( ')之后的所有内容都被逐字引用,直到下一个'被视为结束引号。相反,在双引号( ")内执行了几种 shell 扩展。

  • 参数扩展(用$...${...}):

    ek@Io:~$ echo '$HOME ${USER^^*} ${SHELL%%+([[:alnum:]])}'
    $HOME ${USER^^*} ${SHELL%%+([[:alnum:]])}
    ek@Io:~$ echo "$HOME ${USER^^*} ${SHELL%%+([[:alnum:]])}"
    /home/ek EK /bin/
    
    Run Code Online (Sandbox Code Playgroud)

    这是"shell 脚本中引号的常见用例。特别是,您可能已经看到循环遍历文件名,在双引号内扩展变量,因此它确实被扩展,但没有将其值拆分为单独的单词。例如,这样的命令可能会帮助我在准备大量媒体文件以进行移动时跟踪事物:

    ek@Io:~$ for d in to\ *; do ls -ld "$d"; du -sh "$d"; done
    drwxr-x--- 856 ek ek 32768 Mar 29 10:47 to Albums (partial)
    308G    to Albums (partial)
    drwxrwxr-x 1191 ek ek 40960 Mar 11 12:56 to Books
    21G to Books
    
    Run Code Online (Sandbox Code Playgroud)
  • 命令替换(使用$(...)`...`)和算术扩展(使用$((...))):

    ek@Io:~$ echo '$(date)      `uname -r`      $((2+2))'
    $(date)      `uname -r`      $((2+2))
    ek@Io:~$ echo "$(date)      `uname -r`      $((2+2))"
    Sat Apr  4 20:42:37 EDT 2015      3.19.0-11-generic      4
    
    Run Code Online (Sandbox Code Playgroud)
  • \支持转义单个字符,并且在"引号中很方便,但在更简单的'引号中不受支持(并且通常毫无意义):

    ek@Io:~$ echo '$HOME \$HOME \\\\'
    $HOME \$HOME \\\\
    ek@Io:~$ echo "$HOME \$HOME \\\\"
    /home/ek $HOME \\
    
    Run Code Online (Sandbox Code Playgroud)
  • 历史扩展!(如果启用,当你使用shell交互方式通常是这样):

    ek@Io:~$ # this is just a comment (but I could run a command here)
    ek@Io:~$ echo '!!'
    !!
    ek@Io:~$ # this is just another comment (but could be another command)
    ek@Io:~$ echo "!!"
    echo "# this is just another comment (but could be another command)"
    # this is just another comment (but could be another command)
    
    Run Code Online (Sandbox Code Playgroud)

此外,使用双引号的最常见原因之一是轻松直观地引用包含单引号的文本(因为 a'根本没有特殊含义,在"引号内):

ek@Io:~$ echo "We'll have the dog's fleas gone soon, you'll see."
We'll have the dog's fleas gone soon, you'll see.
Run Code Online (Sandbox Code Playgroud)

最后,虽然您无法转义'内部'引用的文本,但您可以通过使用结束引用'、使用转义'( \') 并使用 继续引用来获得相同的结果'

ek@Io:~$ echo '"My $PATH ain'\''t what it used to be," said the stevedore'\''s apprentice.'
"My $PATH ain't what it used to be," said the stevedore's apprentice.
Run Code Online (Sandbox Code Playgroud)