【发布时间】: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