当前位置: 首页 > 知识库问答 >
问题:

什么时候应该对参数展开进行双引号?[副本]

司徒捷
2023-03-14

假设我有一个变量x。当扩展它时,我应该使用$x还是"$x"

(这是围绕无引号参数展开的任何问题的规范副本。)

共有1个答案

曾洲
2023-03-14

始终使用“$x”,至少在开始时使用。正确的案例远远多于可能错误的案例。

参数扩展需要进行分词和路径名扩展,而这两者通常都不需要。引用扩展将保留参数的文字内容。

比较

$ x="foo * bar"
$ printf '%s\n' "$x"
foo * bar

$ printf '%s\n' $x
foo
<every file in the current directory>
bar

如果您的逻辑确实需要进行分词或路径名扩展,则很有可能需要更改脚本设计以避免该要求。

作为推论,永远没有理由使用${foo[@]}无引号。@索引的存在就是在引用时具有特殊的行为(与*索引相比)。如果不加引号,则两者是相同的,因此您可以使用${foo[*]}

同样的参数适用于特殊参数$@$*

$ x=("foo bar" baz)
$ printf '%s\n' "${x[@]}"  # expands to two elements words, one per element
foo bar
baz
$ printf '%s\n' "${x[*]}"  # expands to one word; elements join using IFS
foo bar baz
$ printf '%s\n' ${x[*]}    # expands to three words
foo
bar
baz
 类似资料:
  • 关于什么时候使用Docker而不是VM的,有什么指导方针吗?(反之亦然) 在我看来,像NGINX、Apache或Redis这样的服务应该是docker,但我不确定是否应该在HPC环境中使用ElasticSearch docker。 Docker总是比VM好吗?

  • 问题内容: 与 我看到越来越多的JavaScript库在处理字符串时使用单引号。为何一个使用另一个原因?我认为它们几乎可以互换。 问题答案: 在不同的库中使用单一或双重的最可能原因是程序员的偏爱和/或API一致性。除了保持一致之外,请使用最适合该字符串的那个。 使用其他类型的引号作为文字: 这可能会变得复杂: ES6中的另一个新选项是使用以下字符的Template文字: 模板文字为以下内容提供了一

  • 问题内容: 最近,我在WeakReferences中遇到了一段Java代码- 尽管在引入它们时会遇到它们,但我从未见过部署它们。这是应该常规使用的还是仅在遇到内存问题时才使用的东西?如果是后者,是否可以轻松地对其进行改造,或者代码需要进行认真的重构?一般的Java(或C#)程序员通常可以忽略它们吗? 编辑 过度热情地使用WR会造成任何损害吗? 问题答案: 弱引用都是关于垃圾回收的。一个 标准的 对

  • 问题内容: 我知道他们两个都禁用了Nagle的算法。 我什么时候应该/不应该使用它们中的每一个? 问题答案: 首先,不是所有人都禁用Nagle的算法。 Nagle的算法用于减少有线中更多的小型网络数据包。该算法是:如果数据小于限制(通常是MSS),请等待直到收到先前发送的数据包的ACK,同时累积用户的数据。然后发送累积的数据。 这将对telnet等应用程序有所帮​​助。但是,在发送流数据时,等待A

  • 问题内容: 在该类中,有两个字符串,和。 有什么不同?我什么时候应该使用另一个? 问题答案: 如果你的意思是和则: 用于在文件路径列表中分隔各个文件路径。考虑在上的环境变量。您使用a分隔文件路径,因此在上将是;。 是或用于拆分到特定文件的路径。例如在上,或

  • 问题内容: 在集成我以前从未使用过的Django应用程序时,我发现了用于定义类中函数的两种不同方式。作者似乎非常有意地使用了它们。第一个是我自己经常使用的: 另一个是我不使用的,主要是因为我不知道何时使用它,以及什么用途: 在Python文档中,装饰器的解释如下: 类方法将类作为隐式第一个参数接收,就像实例方法接收实例一样。 所以我想指的是自己(而不是实例)。我不完全理解为什么会这样,因为我总是可