【问题标题】:What does the POSIX spec mean when it says this is necessary to avoid ambiguity?当 POSIX 规范说有必要避免歧义时,它是什么意思?
【发布时间】:2023-03-03 13:52:01
【问题描述】:

回复this comment时:

现在我得到了两个“:”是独立的,这就是为什么我找不到任何关于它们的文档。在这种情况下需要第一个吗?

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

在前面显示的参数扩展中,在格式中使用 将导致对未设置或为空的参数进行测试; 的省略将导致对仅未设置的参数进行测试。如果参数是'#'并且省略了冒号,应用程序应确保指定单词(这是避免字符串长度扩展产生歧义所必需的)。

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

当不执行子字符串扩展时,使用下面描述的形式(例如,':-'),Bash 测试未设置或为空的参数。省略冒号会导致仅对未设置的参数进行测试。换句话说,如果包含冒号,则运算符会测试两个参数的存在以及它的值是否不为空;如果省略冒号,则运算符仅测试存在性。

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

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

如果参数是'#'并且省略了冒号,应用程序应确保指定word(这是避免字符串长度扩展产生歧义所必需的)。

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

没有一个扩展符号在 shell 变量名中有效,因此它们不可能以单字符变量名开头。如果他们可以使用parameter#总是 不带冒号是模棱两可的,因为你永远无法判断${#+foo} 是指变量foo 的长度还是替代扩展#

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

【问题讨论】:

  • 您的某些引文似乎漏掉了一些字。你能检查一下你复制和粘贴的所有内容是否正确吗?
  • 我的猜测是应用程序应该在${#-}${#-foo} 之间产生差异:因为始终设置#,当应用程序解析${#- 的开头时它不能停止那里知道这是否意味着#的扩展;请记住,- 是一个有效的变量名。
  • ${#?}${#?foo} 也是如此。

标签: bash shell sh variable-expansion


【解决方案1】:

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

$ echo $-
himBH

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

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

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

【讨论】:

  • 是的。 $? 也是如此。
  • 是的。 ${#?} 可能是 $? 的长度,或者当 $# 未设置时出现空错误消息(这不太可能)。 语法不明确的另一种情况,但语义提供了一个简单的选择。
  • 啊。这是有道理的,尽管我会争辩说规范措辞使${#?}${#-} 成为错误,而不是解决了有利于长度解释的问题。因为没有指定 word。虽然我意识到这对解释没有多大用处。
  • 好点。这似乎是一个更清晰的解释,尽管我不知道在任何情况下 # 可能会因为 word 的选择或存在而被取消设置。
猜你喜欢
  • 2020-09-15
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-24
相关资源
最近更新 更多