关于linux:为什么我在shell脚本中使用双引号

Why do I use double quotes in shell scripts

本问题已经有最佳答案,请猛点这里访问。

我了解单引号和双引号的用法。

但我不知道情况需要在脚本中加双引号。

这句话没有区别

1
2
$ echo hello world! $1
$ echo"hello world! $1"

请显示普通引号和双引号之间的差异。


让我们考虑一个包含这些文件的目录:

1
2
$ ls foo*
foo111.txt  foo11.txt  foo1.txt

让我们考虑一下您的脚本的一个小变化:

1
2
3
4
$ cat script
#!/bin/sh
echo No quotes $1
echo"Double quotes $1"

现在,让我们运行它:

1
2
3
$ bash script"foo*"
No quotes foo111.txt foo11.txt foo1.txt
Double quotes foo*

如你所见,结果完全不同。如果没有双引号,则执行路径名扩展。

为了说明另一个区别:

1
2
3
$ bash script"long              space"
No quotes long space
Double quotes long              space

通过双引号,单词之间的长空格得以保留。如果没有它,所有相邻的空白都将替换为一个空白。这是一个分词的例子。


一个示例可以演示该用法

  • 用空格容纳字符串

    1
    var=file name # Not the intended effect.

    file存储在var中,而name被shell作为一个单独的命令,这会给您一个错误。

  • 防止分词

    1
    2
    var="file name"
    cp $var newfile

    在这里$var扩展到EDOCX1[3]并且实际上,命令将变为

    1
    cp file name newfile

    而cp会将filename作为2个源文件,newfile作为目标目录,这会给您带来错误:

    1
    cp: target 'newfile' is not a directory

    如果确实存在名为"newfile"的目录,它将给出错误:

    1
    2
    cp: cannot stat 'file': No such file or directory
    cp: cannot stat 'name': No such file or directory

    正确的方法是

    1
    cp"$var" newfile

    在这种情况下,完全扩展的$var被认为是单个字符串。