【问题标题】:Why do I use double quotes in shell scripts [duplicate]为什么我在 shell 脚本中使用双引号 [重复]
【发布时间】:2016-12-10 00:06:58
【问题描述】:

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

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

声明没有差异

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

请告诉我普通引号和双引号之间的区别。

【问题讨论】:

  • bash 中的分词由IFS 变量(“内部字段分隔符”)控制,默认为IFS=$' \t\n'spacetab,@ 987654326@)。如果你不引用你的变量分词出现在IFS中的任何字符上(你可以设置IFS来控制这个)。引用也会影响文件/路径名扩展

标签: linux bash shell scripting


【解决方案1】:

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

$ 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

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

【讨论】:

    【解决方案2】:

    一个例子可以演示使用

    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 被视为单个字符串。

    【讨论】:

    • @anishsane : 感谢编辑..
    • 我注意到您已经回答了许多 bash 问题,这些问题随后作为重复而被关闭。也许您想查看Stack Overflow bash tag wiki 以获取常见问题列表;显然,请随时帮助我们使其保持最新、易于理解和有条理,提前致谢!
    • @tripleee :我以后会处理这个问题。我承认这个有点懒惰.. :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-26
    • 1970-01-01
    • 2019-08-10
    • 2020-07-21
    • 2018-05-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多