命令行上双引号“”,单引号“和反引号”之间的区别?

我经常看到网站上的教程或本网站上的post,这些教程在命令行中大量使用了以下字符。 通常它们似乎用于非常相似的目的。 在命令行上使用或shell编程时,它们之间有什么区别? 我出于什么目的使用它们中的哪一个?

" " double quotes ' ' single quotes ` ` backticks 

为了举例,考虑变量foo包含unamefoo=uname )。

  • echo "$foo"输出uname ,替换文本中的变量。
    • 对于"引号内的文字$字符,请使用\$ ;作为文字" ,使用\"
  • echo '$foo'输出$foo ,确切的字符串。
    • 甚至'不能在'引号内'转义为\' ' 。 但你可以使用'foo'\''bar'
  • echo `$foo`输出Linux ,执行变量的内容并echo打印它。

在bash手册的相关部分中对此进行了很好的解释。 简而言之,单引号内的任何内容都按字面解释。 所以,例如:

 $ echo '$SHELL' $SHELL $ echo '{1..3}' {1..3} 

将其与未加引号的版本进行比较:

 $ echo $SHELL /bin/bash $ echo {1..3} 1 2 3 

双引号允许变量扩展(也包括历史扩展和其他一些东西)。 基本上,当您处理想要扩展的内容时,可以使用它们。 例如:

 $ echo "$SHELL" /bin/bash $ echo "!!" echo "echo "$SHELL"" echo /bin/bash 

换句话说,单引号完全保护字符串不受shell的影响,而双引号保护某些内容(例如空格),但允许正确扩展/解释变量和特殊字符。

单引号( '' )用于保留引号中包含的每个字符的文字值。

使用双引号( "" ),保留所有字符的文字值,除了美元符号( $ ),反引号(向后单引号, `` )和反斜杠( \ )。

当封闭在back-ticks( `` )中时,shell将某些东西解释为“后面滴答内的命令输出”。 这被称为“命令替换”,因为命令的输出代替命令本身。

引用:

 echo '$HOME' is "$HOME" 

单引号阻止变量扩展,而双引号允许它。

我只是在谈论一般但是:

"" – 用于在输出之前处理它们内部的一些信息。 (就像PHP一样。)

  • 例如: name=NESS; echo "Hello my name is $name" name=NESS; echo "Hello my name is $name"将输出: Hello my name is NESS

'' – 用于显示输出。 (也像在PHP中一样。)

  • 使用上面的例子,它将输出Hello my name is $name

因此,双引号和单引号之间的区别在于双引号处理变量并显示值,而单引号显示变量的名称而不进行处理。

`` – 用于引用稍后分配给另一个变量的命令。

单引号包含一个字面值:所有类型的扩展都被抑制。 通常在值包含或可能包含空格(空格,制表符,换行符)或特殊字符( $\` )时使用,用户不希望shell特别扩展/处理。

双引号括起一个值,该值将包含变量,并完成字符替换。 输出可能包含空格时必需,并且必须指定为单个值。

后引号括起一个命令,其结果需要作为值。 较新的shell允许使用$(...)代替`...` 。 我更喜欢新方法。

以下代码可能有助于了解正在发生的事情。

  CMD ='ls。'
 echo sq:$ CMD
设置$ CMD
 echo raw 1:$ 1
 echo raw:$ *
设置“$ CMD”
 echo dq:1美元
 echo bq:`$ CMD`
 echo new:$($ CMD)