POSIX规范在说明为避免含糊不清时有何意义?

时间:2015-05-08 15:05:20

标签: bash shell sh variable-expansion

回复this comment时:

  

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

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

  

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

我在bash参考手册中看到了匹配的说明:

  

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

之前和我理解这些扩展的冒号版本有什么不同。

刚才让我感到困惑的是这句话来自规范:

  

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

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

没有任何扩展符号在shell变量名中有效,因此它们不可能启动单字符变量名。如果他们可以使用parameter # 总是在没有冒号的情况下是不明确的,因为你永远无法判断${#+foo}是否意味着变量的长度{{ 1}}或foo上的替代扩展等

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

1 个答案:

答案 0 :(得分:5)

for($i = 0; $i < $length; $i++) { $v_or_c = rand(0,1); if($v_or_c) { $nick_name .= $chrs[$v_or_c][rand(0, sizeof($chrs[$v_or_c]))]; } else { $nick_name .= $chrs[$v_or_c][rand(0, sizeof($chrs[$v_or_c]))]; } } echo ucfirst($nick_name); // ucfirst - to upper case first letter 也是一个shell特殊参数,其值是一个字符串,指示当前设置的shell选项。例如,

-

$ echo $- himBH 是参数长度的语法。

${#parameter}

表达式$ foo=bar $ echo ${#foo} 3 因此是不明确的:是${#-}的值的长度,还是如果$-为空,它是否会扩展为空字符串? (不太可能,因为$#总是一个整数,不能取消设置,但在语法上是合法的。)我将规范解释为$#应该通过扩展到${#-}的长度来解决歧义(大多数贝壳似乎都是这样做的。)