【发布时间】:2018-12-14 19:12:44
【问题描述】:
当使用 BASH Parameter Expansion 时,可以引用/转义变量扩展成的字符串,这可以正常工作,除非使用单引号并且整个变量用双引号进行转义:
$ echo "${var:-\\a}"
\a # ok
$ echo "${var:-"\\a"}"
\a # ok
$ echo "${var:-$'\\a'}"
\a # ok
$ echo "${var:-'\a'}"
'\a' # wtf?
有趣的是,$' ' 引号可以正常工作,而' ' 不能。如果变量本身没有被引用,单引号开始正常工作:
$ echo ${var:-'\a'}
\a
但是,如果$var 本身包含空白字符,则可能会导致其他问题。
这种不一致有什么好的理由吗?
【问题讨论】:
-
双引号内的单引号按字面意思保留。
echo "'foobar'"保留了',但echo ""foobar""没有 -
@Inian 在您的示例中,
foobar本身将不被引用。那么,为什么var2=*; echo "${var:-"$var2"}"的输出只是*,而echo ""*""的输出是对所有文件的全局扩展? -
This paragraph 似乎正在研究类似的问题。
-
参数扩展中的引号很棘手。
bash本身(在 4.0 发布后的某个时间)改变了对待它们的方式以遵守 POSIX 规则。 -
@chepner 我试图在发行说明中找到这样的更改,但我找不到任何东西。不过,我记得我曾经看到过与它相关的东西。
标签: bash shell quotes quoting parameter-expansion