Bash Shell中的单引号和双引号有什么区别?
在命令行上将文本括在引号中是相当标准的做法,尤其是在处理名称中带有空格的文件时,但是如何知道使用单引号还是双引号呢?让我们看一下两者的区别,以及何时应该使用一个与另一个。
一般规则是,双引号仍然允许变量在引号内扩展,而单引号则不允许。
简单文字引号
如果我们只是简单地附上几个单词,那么使用哪一个单词都没有关系,因为它们的工作原理完全相同。例如,这两个命令都将创建一个名为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程序上扩展。
单引号
- 单引号内的所有字符都解释为字符串字符。