我理解使用单引号和双引号。
但我不知道情况需要在脚本中加双引号。
没有差异的陈述
$ echo hello world! $1
$ echo "hello world! $1"
请告诉我正常和双引号之间的差异。
答案 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)
示例可能会演示使用
容纳带空格的字符串
var=file name # Not the intended effect.
file
存储在var
中,name
被shell作为单独的cmd使用,这会给您一个错误。
防止分词
var="file name"
cp $var newfile
这里$ var扩展为file name
,实际上命令将变为
cp file name newfile
和cp会将file
和name
作为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
被视为单个字符串。