Bash Shell中的单引号和双引号有什么区别?

时间:2020-01-09 10:44:13  来源:igfitidea点击:

在命令行上将文本括在引号中是相当标准的做法,尤其是在处理名称中带有空格的文件时,但是如何知道使用单引号还是双引号呢?让我们看一下两者的区别,以及何时应该使用一个与另一个。

一般规则是,双引号仍然允许变量在引号内扩展,而单引号则不允许。

简单文字引号

如果我们只是简单地附上几个单词,那么使用哪一个单词都没有关系,因为它们的工作原理完全相同。例如,这两个命令都将创建一个名为Test Directory的目录:

mkdir "Test Directory"

mkdir 'Test Directory'

比较有经验的类型可能会注意到,如果需要,我们也可以使用mkdir Test \ Directory。

Shell变量展开

默认情况下,当我们在命令行中处理变量时,单引号和双引号之间的区别变得尤为重要,bash会将$ test之类的变量扩展为完整字符串。首先,很好地分配变量:

test="This is a test"

现在,我们可以像这样在命令行上使用此变量,该变量应简单地输出这是对控制台的测试:

echo $test

在这里,当我们使用单引号时,双引号和单引号之间的差异会变得更加明显,变量arent将被扩展。例如,如果运行此命令:

echo '$test'

使用单引号时,我们只会在命令行上看到$ test',但是当我们使用双引号时,它将正确输出:

当我们使用`字符在命令行上展开命令时,同样的事情也起作用。例如,假设我们要在另一个命令中使用pwd命令,并使用反引号告诉shell扩展它:

echo `pwd`/test

如果我们位于主文件夹中,则会看到如下所示的输出:

/home/data/test

举例来说,假设我们位于路径中有空格的文件夹中,并且想要使用ln命令创建指向当前目录中文件的符号链接。通常在使用ln命令时需要指定完整路径,因此使用pwd来保存键入内容要容易得多。

查看当我们尝试使用该命令而不用引号引起来时会发生什么:

ln –s `pwd`/test /home/data/linkedname

相反,我们需要用引号引起来:

ln –s "`pwd`/filename" /some/other/path

对于一个更具体的示例,让我们假设我们有一个类似于此示例的文件夹结构,其中所有文件名中都包含空格:

由于unzip命令不支持使用*对所有文件运行它,因此我们需要改用for命令。事情变得有趣的地方:

for f in *.zip;do unzip $f;done

糟糕!看起来好像没有用。

相反,需要做的是在$ f变量周围使用双引号,例如:

for f in *.zip;do unzip "$f";done

现在,每次for命令通过循环时,它将实际运行如下命令:

unzip "test 1.zip"

当然,它将遍历目录并为目录中的每个文件运行类似的命令。

总结

双引号

  • 当我们要封装变量或者在字符串内使用shell扩展时使用。

  • 其中的所有字符都将解释为常规字符,但$或者 ` 会在shell程序上扩展。

单引号

  • 单引号内的所有字符都解释为字符串字符。