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. |
防止分词
1 2 | var="file name" cp $var newfile |
在这里$var扩展到EDOCX1[3]并且实际上,命令将变为
1 | cp file name newfile |
而cp会将
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 |
在这种情况下,完全扩展的