考虑以下:
$ ksh -c '1(){ echo hi;};1'
ksh: 1: invalid function name
$ dash -c '1(){ echo hi;};1'
dash: 1: Syntax error: Bad function name
$ bash -c '1(){ echo hi;};1'
bash: `1': not a valid identifier
bash: 1: command not found
$ mksh -c '1(){ echo hi;};1'
hi
基本上,我试图声明函数1
,0
这将是 and 的简写true
,false
但正如你所看到的,我在函数中使用数字名称时遇到了问题。别名和两位数名称也会发生相同的行为。
问题是“为什么”?它是 POSIX 规定的吗?或者只是一个类似伯恩的贝壳的怪癖?
另请参阅与此相关的问题。
POSIX 说:
和:
所以以数字开头的单词不能是函数名。
这是许多语言中的一个标准,用于防止数学运算与变量或函数或方法之间的混淆。
考虑:
如您所见,如果允许数字作为变量或函数名称,那么稍后在程序中进行数学运算可能会变得非常混乱,如果您以后需要实际使用这些数字进行数学运算,则必须想出创造性的解决方法。它还可以在某些语言中产生意想不到的结果。想象一下,您正在为循环增加一个数字,但其中一个数字已经是一个等于字符串的变量。它会立即抛出一个错误。如果您不是代码的原始作者,则可能需要很长时间才能找到该错误。
简而言之,这就是为什么大多数语言不允许您使用数字作为变量或函数或方法等的名称。
在 C 中,考虑如下表达式:
是
1000l
变量还是常数?因为变量名不能以数字开头,所以它必须是常数。这使得解析更容易和更严格(1000k
可以很容易地捕捉到拼写错误)。对变量和函数名使用单一规则也更容易,因为函数也可以被视为变量。当然,现在解析器更加复杂和强大,并且我们在 C++ 中拥有诸如自定义文字之类的东西。但是在那些远古时代,牺牲一点不必要的灵活性可能会使您的编译(或解释)时间大大缩短(并且人们仍然抱怨 C++ 编译时间)。您可以在整个 shell 语言中看到 C 影响的影响,因此 Bourne shell(或 C shell)以及因此 POSIX 将允许名称的类限制为与 C 相同也就不足为奇了。