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

Ser*_*nyy 18 shell variable

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

基本上,我所做的是

$ set 1 2 3 4 5
$ echo ${$#}
13819
$ echo $$
13819
Run Code Online (Sandbox Code Playgroud)

显然,%在这样的构造中,字符也会被忽略

$ echo ${$%}
13819
Run Code Online (Sandbox Code Playgroud)

但是*@导致错误的替换错误:

$ echo ${$*}
sh: 10: Bad substitution
$ echo ${$@}
sh: 11: Bad substitution
Run Code Online (Sandbox Code Playgroud)

Mic*_*mer 35

这是$$ 删除了空前缀

${parameter#[word]}

删除最小前缀模式。这个应该被扩展以产生一个模式。参数扩展将导致参数,其中与删除的模式匹配的前缀的最小部分。如果存在,单词不应以未加引号的 开头#

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