为什么我在shell脚本中使用双引号

时间:2016-08-04 02:38:17

标签: linux bash shell scripting

我理解使用单引号和双引号。

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

没有差异的陈述

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

请告诉我正常和双引号之间的差异。

2 个答案:

答案 0 :(得分:5)

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

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

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

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

现在,让我们运行它:

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

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

说明另一个不同之处:

$ bash script "long              space"
No quotes long space
Double quotes long              space

使用双引号,保留单词之间的长空格。没有它,所有连续的空格都被替换为一个空格。这是分词的一个例子。

答案 1 :(得分:1)

示例可能会演示使用

  1. 容纳带空格的字符串

    var=file name # Not the intended effect.
    

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

  2. 防止分词

    var="file name"
    cp $var newfile
    

    这里$ var扩展为file name,实际上命令将变为

    cp file name newfile
    

    和cp会将filename作为2个源文件,将newfile作为目标目录,它会显示错误:

    cp: target 'newfile' is not a directory
    

    如果确实存在名为'newfile'的目录,则会出错:

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

    正确的方法是

    cp "$var" newfile
    

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