【问题标题】:How to use double quotes when assigning variables?分配变量时如何使用双引号?
【发布时间】:2021-11-23 04:43:52
【问题描述】:

有一个类似这样的 bash 文件:

FOO=${BAR:-"/some/path/with/$VAR/in/it"}

那些双引号是必要的吗?根据以下测试,我会说不,并且在上述作业中根本不需要引用。实际上,是该变量的用户需要在双引号内将其展开以避免错误拆分。

touch 'some file'  # create a file
VAR='some file'    # create a variable for that file name
FOO=${BAR:-$VAR}   # use it with the syntax above, but no quotes
ls -l "$FOO"       # the file does exist (here we do need double quotes)
ls -l $FOO         # without quotes it fails searching for files `some` and `file`
rm 'some file'     # remove temporary file

我说的对吗?或者还有什么?

【问题讨论】:

  • 你说得对,这个特殊情况不需要引用 - mywiki.wooledge.org/Quotes#When_Should_You_Quote.3F,因为它属于链接中提到的简单分配类别跨度>
  • @Inian,如果我理解我所阅读的内容,该链接解释了为什么不需要整个 RHS 的引号。我怎么知道这意味着 中不需要引号,就像我的问题的第一个 sn-p 中的情况一样?
  • 始终使用双引号。节省几次击键的时间永远不会超过未来的通宵调试,一旦多年未触及的脚本由于特殊的路径字符而开始崩溃,势必会到来。去过那里,做到了:永远值得。至于最初的问题,我会像FOO="${BAR:-"/some/path/with/${VAR}/in/it"}"FOO="${BAR:-/some/path/with/"$VAR"/in/it}" 一样引用它;细节取决于品味和脚本的约定。在任何情况下,目标都是从不扩展未引用的未知数据(例如变量/命令扩展)。
  • @AndrejPodzimek,这看起来很像 “让我们将 ; 放在 C++ 中函数的 } 之后,为什么不呢?”
  • @Enlico 不,它确实不是看起来那样。让我给你一个提示:在 C++ 中 } 之后的 ; 以什么方式保护你免受包含(例如)将来可能出现的空格的路径名的影响?那里。这就是重点。此外,涉及 C(++) 和 Bash 的类比大多是有缺陷的。

标签: bash variables whitespace double-quotes


【解决方案1】:

这些双引号有必要吗?

在这种情况下不是,不。

我说的对吗?

是的。 总是变量的用户必须引用它 - 字段拆分在扩展变量时运行,因此在使用它时必须引用它。

也有例外,例如 case $var insomevar1=$somevar2 - 不运行字段拆分的上下文,因此不需要引用。但无论如何,引号在这种情况下不会受到伤害,并且无论如何都可以使用。

或者还有什么?

来自POSIX shell

2.6.2 参数扩展

此外,可以使用以下格式之一修改参数扩展。在每种需要 word 的值的情况下(根据参数的状态,如下所述),word 应进行波浪号扩展、参数扩展、命令替换和算术扩展。 p>

${参数:-word}

因为field splitting expansion 并没有在word 内部运行${parameter:-word},所以引用并没有多大作用。

【讨论】:

  • 答案已接受,但考虑一下,我需要澄清一下。当您写到var=$var 是一个例外时,您是指一般指var=$other_var 还是精确地指自分配(我猜这应该导致无操作)?此外,您的第一句话= 右侧分配的内容周围使用它们 似乎与不需要" 的结论有些矛盾。你能澄清一下吗?
  • are you referring generally 是的 ;) 甚至 var=$var1$var2--$var3Could you clarify? 对不起,我很直白。问题是“如何使用......”所以我尝试回答“如何使用......”而不是“何时使用”......也许这部分最好删除,它没有任何目的。
  • 所以逻辑是这样的? “分配变量时如何使用双引号?” -> "(如果你想使用它们)在=右侧要分配的东西周围使用它们。"
猜你喜欢
  • 2023-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多