bash 中“ ”和“ ”的区别

bash 中“ ”和“ ”的区别

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

当我使用它们时,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:~$ 

是否存在我们需要使用其中一个的特定情况?

谢谢。

答案1

狂欢(Ubuntu 默认的交互式),单引号 ( ') 后面的所有内容都是逐字引用,直到下一个'被视为结束引号。相反,在内部执行几种类型的 shell 扩展双引号")。

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

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

    这是 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
    
  • 命令替换(与$(...)`...`)和算术扩展(和$((...))):

    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
    
  • 使用以下方式转义单个字符\在引号中受支持并且很方便",但在更简单的引号中不受支持(并且通常是毫无意义的)'

    ek@Io:~$ echo '$HOME \$HOME \\\\'
    $HOME \$HOME \\\\
    ek@Io:~$ echo "$HOME \$HOME \\\\"
    /home/ek $HOME \\
    
  • 历史扩展使用!(如果已启用,通常在您以交互方式使用 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)
    

此外,使用双引号的最常见原因之一是可以轻松直观地引用包含单引号的文本(因为在引号'内 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.

最后,虽然你无法转义'内部'引用的文本,但你可以通过以下方式实现相同的效果:结尾用 引用',使用转义的'( \'),然后使用 继续引用'

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.

答案2

bodhi.zazen 上面发布的 stackoverflow 链接回答了这个问题。

下面是一种有区别的情况。

sps@sps-Inspiron-N5110:~$ echo "Hello, I have only $((3+5)) $ in my account"
Hello, I have only 8 $ in my account
sps@sps-Inspiron-N5110:~$ echo 'Hello, I have only $((3+5)) $ in my account'
Hello, I have only $((3+5)) $ in my account
sps@sps-Inspiron-N5110:~$ 

发布这个答案,只是为了让其他人知道我已经得到答案了。(我曾发布过这个问题。)

谢谢。

相关内容