何时使用单引号,在grep中双引号?

当试图在一个文件中search一个简单的模式“hello”时,所有以下forms的grep工作:

  • grep hello file1
  • grep'hello'file1
  • grep“hello”file1

有没有一个特定的情况下,上述forms之一的工作,但其他人没有。 如果我用一个替代另一个,它有什么区别吗?

    这实际上取决于你的shell。 行情(任何一种)主要是为了处理空白。 例如,以下内容:

    grep hello world file1 

    将在名为“world”和“file1”的文件中查找单词“hello”

     grep "hello world" file1 

    将在file1中寻找“hello world”。

    单引号或双引号之间的select只有在searchstring包含您期望评估的variables或其他项时才是重要的。 用单引号,string是从字面上采取的,没有扩展发生。 用双引号,variables被扩展。 例如(用Bash或ZSH等Bourne衍生的shell):

     VAR="serverfault" grep '$VAR' file1 grep "$VAR" file1 

    第一个grep将在file1中查找string“$ VAR1”。 第二个将展开“$ VAR”variables并在file1中查找string“serverfault”。

    詹姆斯是正确的,但是为了增加更多的数据,我认为最好的思考方式是作为命令的参数:你打算把“你好”还是“世界”作为两个参数,或者“你好世界”是一个参数论据。

    而且,双引号不仅允许解释variables。 究竟是什么取决于你的shell,但检查历史扩展,大括号扩展和文件名扩展。

    同样重要的是要注意,在某些情况下,您需要在一个参数中使用两种types的引号。 请记住(默认情况下)参数是由空格分隔的,所以如果你不留空间,你仍然指定相同的参数。

    大多数shell的单引号机制不允许有任何特殊字符,这意味着任何另一个单引号的实例,即使它似乎被转义,都会结束引号。 因此,不可能在单引号string中传递带单引号的string,而且必须使用双引号。 当你想传递一个包含单引号的参数和一些将被解释的参数时,这可能是一个痛苦,但你不想成为。 例如,如果你想传递string“`”$ VAR'是一个variables“,你必须这样做:

     "'"'$VAR'"' is a variable" 

    这实际上是三个引号转义string的连接:

     "'" '$VAR' "' is a variable" 

    或者,除去引号:

     ' $VAR ' is a variable 

    实际上,对于大多数贝壳,你也可以这样做:

     "'\$VAR' is a variable" 

    反斜杠(“ \ ”)告诉shell直接接受下面的字符,而不是对其进行任何扩展。

    但是有些情况下,您最终不得不采用多string连接的方式,而不是现在我们可以真正想出一个例子。