当 POSIX 规范说这是避免歧义所必需的时,它是什么意思?

What does the POSIX spec mean when it says this is necessary to avoid ambiguity?

回复时:

Now I got the the two ":"s are independent, and that's why I couldn't find any document about them. Is the first one needed in this case?

我第一次注意到规范中的这一段:

In the parameter expansions shown previously, use of the <colon> in the format shall result in a test for a parameter that is unset or null; omission of the <colon> shall result in a test for a parameter that is only unset. If parameter is '#' and the colon is omitted, the application shall ensure that word is specified (this is necessary to avoid ambiguity with the string length expansion).

我在bash参考手册中看到了匹配的解释:

When not performing substring expansion, using the form described below (e.g., ‘:-’), Bash tests for a parameter that is unset or null. Omitting the colon results in a test only for a parameter that is unset. Put another way, if the colon is included, the operator tests for both parameter’s existence and that its value is not null; if the colon is omitted, the operator tests only for existence.

之前我明白这些扩展的冒号版本有什么区别。

刚才让我困惑的是规范中的这句话:

If parameter is '#' and the colon is omitted, the application shall ensure that word is specified (this is necessary to avoid ambiguity with the string length expansion).

我不明白如果 word 未指定,这里可能会有什么歧义。

None 扩展印记在 shell 变量名中有效,因此它们不可能以单字符变量名开头。如果他们可以然后使用 #parameter 的话 always 会在没有冒号的情况下变得模棱两可,因为你永远无法判断 ${#+foo} 是否意味着变量 foo# 的替代扩展,等等

我在这里错过了什么?什么歧义需要确保 word 存在? (我的意思是在这个扩展中没有 word 显然没有用,但这不是一回事。)

-也是一个shell特殊参数,其值为一个字符串,表示当前设置了哪些shell选项。例如,

$ echo $-
himBH

${#parameter} 是参数长度的语法。

$ foo=bar
$ echo ${#foo}
3

表达式 ${#-} 因此是不明确的:它是 $- 值的长度,还是如果 $# 为空则扩展为空字符串? (不太可能,因为 $# 始终是一个整数并且不能取消设置,但在语法上是合法的。)我将规范解释为意味着 ${#-} 应该通过扩展到 $- 的长度来解决歧义(这似乎是大多数 shell 所做的)。