为什么 ${$#} 在 shell 中返回与 $$ 相同的结果?

为什么 ${$#} 在 shell 中返回与 $$ 相同的结果?

在尝试获取 中设置的最后一个位置参数时/bin/dash,我尝试过echo ${$#}。令人惊讶的是,这并没有导致错误,而是导致与$$变量内容相同的PID。问题是,为什么这个语法有效? shell在这里应用的语法规则是什么?

基本上,我所做的是

$ set 1 2 3 4 5
$ echo ${$#}
13819
$ echo $$
13819

显然,%在这种构造中,角色也会被忽略

$ echo ${$%}
13819

*@导致严重的替换错误:

$ echo ${$*}
sh: 10: Bad substitution
$ echo ${$@}
sh: 11: Bad substitution

答案1

这是$$ 删除了空前缀:

${parameter#[word]}

删除最小的前缀模式。这单词应扩展以产生图案。参数扩展将导致范围,删除与模式匹配的前缀的最小部分。如果存在的话,单词不得以未加引号的 开头#

这同样适用于%(后缀)。@*不是参数扩展修饰符,因此它们是错误。对于$?$-或假设也会发生这种情况$=${$+}是一个空展开式。

相关内容