回复this comment时:
现在我得到了两个":" s是独立的,这就是为什么我找不到关于它们的任何文件的原因。在这种情况下,第一个需要吗?
我第一次在规范中注意到了这一段:
在前面显示的参数扩展中,使用<冒号>格式应导致测试未设置或为null的参数;省略<冒号>将导致仅对未设置的参数进行测试。如果参数是'#'并且冒号被省略,应用程序应确保指定单词(这是为了避免字符串长度扩展的歧义)。
我在bash参考手册中看到了匹配的说明:
当不执行子串扩展时,使用下面描述的形式(例如,': - '),Bash测试未设置或为null的参数。省略冒号只会导致对未设置的参数进行测试。换句话说,如果包含冒号,运算符将测试参数的存在性及其值不为空;如果省略冒号,则运算符仅测试是否存在。
之前和我理解这些扩展的冒号版本有什么不同。
刚才让我感到困惑的是这句话来自规范:
如果参数为'#'并且冒号被省略,应用程序应确保指定 word (这是为了避免字符串长度扩展的歧义)。
如果word
未指定,我不明白这里有什么歧义。
没有任何扩展符号在shell变量名中有效,因此它们不可能启动单字符变量名。如果他们可以使用parameter
#
总是在没有冒号的情况下是不明确的,因为你永远无法判断${#+foo}
是否意味着变量的长度{{ 1}}或foo
上的替代扩展等
我在这里缺少什么?什么含糊不清需要确保#
存在? (我的意思是,在此扩展中没有word
显然没有用,但这不是一回事。)
答案 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
因此是不明确的:是${#-}
的值的长度,还是如果$-
为空,它是否会扩展为空字符串? (不太可能,因为$#
总是一个整数,不能取消设置,但在语法上是合法的。)我将规范解释为$#
应该通过扩展到${#-}
的长度来解决歧义(大多数贝壳似乎都是这样做的。)