在尝试获取 中设置的最后一个位置参数时/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]}
删除最小的前缀模式。这单词应扩展以产生图案。参数扩展将导致范围,删除与模式匹配的前缀的最小部分。如果存在的话,单词不得以未加引号的 开头
#
。
这同样适用于%
(后缀)。@
和*
不是参数扩展修饰符,因此它们是错误。对于$?
、$-
或假设也会发生这种情况$=
。${$+}
是一个空展开式。