考虑以下:
$ 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
它们将是true
和的简写false
,但正如您所见,我在函数中使用数字名称时遇到了问题。别名和两位数名称也会出现同样的行为。
问题是“为什么”?这是 POSIX 规定的吗?还是仅仅是 Bourne 类 shell 的一个怪癖?
也可以看看相关问题到这个。
答案1
POSIX 说:
2.9.5 函数定义命令
函数是用户定义的名称,用作简单命令来调用具有新位置参数的复合命令。函数使用“函数定义命令”进行定义。
函数定义命令的格式如下:
fname ( ) compound-command [io-redirect ...]
该函数被命名为名称;应用程序应确保它是一个名称(参见 XBD姓名),并且它不是特殊内置实用程序的名称。实现可以允许函数名称中包含其他字符作为扩展。实现应为函数和变量维护单独的名称空间。
和:
3.235 名称
在 shell 命令语言中,一个仅由可移植字符集中的下划线、数字和字母组成的单词。名称的第一个字符不是数字。
注意:可移植字符集在可移植字符集中有详细定义。
因此以数字开头的单词不能作为函数名称。
答案2
这是许多语言中的标准,以防止数学运算和变量或函数或方法混淆。
考虑:
var 1 = 100
print 1*10 //should return 10 but would instead return 1000
var x = 5
x += 1
print x //returns 105, not 6
def 100(num)
return num * 1000
end
var y = 10 + 100(10)
print y // returns 100010 instead of 1010
如您所见,如果允许使用数字作为变量或函数名称,那么以后在程序中进行数学运算可能会变得非常混乱,如果您以后真的需要使用这些数字进行数学运算,您将不得不想出创造性的解决方法。在某些语言中,它还会产生意想不到的结果。想象一下,您正在为循环增加一个数字,但其中一个数字已经是一个等于字符串的变量。它会立即抛出一个错误。如果您不是代码的原作者,那么这个错误可能需要很长时间才能找到。
简而言之,这就是为什么大多数语言不允许您使用数字作为变量、函数、方法等的名称。
答案3
在 C 语言中,考虑如下表达式:
1000l + 2.0f;
是1000l
变量还是常量?因为变量名不能以数字开头,所以它必须是常量。这使得解析更容易和更严格(拼写错误如1000k
可以轻松发现拼写错误)。变量和函数名也更容易制定单一规则,因为函数也可以被视为变量。现在当然,解析器要复杂得多,功能也强大得多,而且 C++ 中还有自定义文字之类的东西。但在史前时代,牺牲一点不必要的灵活性可能会大大缩短编译(或解释)时间(而且人们仍然在抱怨 C++ 编译时间)。
并且您可以看到 C 影响力贯穿整个 shell 语言,因此 Bourne shell(或 C shell)以及 POSIX 将允许的名称类别限制为与 C 相同也就不足为奇了。