函数或脚本名称包含破折号“-”而不是下划线“_”会不会很糟糕?

函数或脚本名称包含破折号“-”而不是下划线“_”会不会很糟糕?

-如果我用破折号而不是单词之间的下划线来命名函数或脚本_,那会很糟糕吗?例如,function duplicate-me()duplicate-me.sh

在 bash 中,变量名可以包含下划线,但不能包含破折号。如果我使用破折号而不是下划线来命名函数和脚本,那么 bash 永远不会将这样的名称解释为变量,并且如果我误用这样的名称作为变量,我可以预期 bash 会给出错误消息。

谢谢。

答案1

如果你想便携,使用破折号是不好的,标准仅允许字母数字和下划线,因此破折号可能不适用于所有 shell:

$ dash -c 'foo-bar() { echo foo-bar; }; foo-bar'
dash: 1: Syntax error: Bad function name

(Busybox 和 ksh 也不接受它们;Bash、Zsh 和 mksh 接受。)

如果您知道自己正在使用 Bash,那么这不是问题,因此如果您喜欢破折号,则可以在函数名称中使用它们。但是,如果您想避免滥用函数来代替变量名,请注意,eg$foo-bar${foo-bar}都是有效的 shell 语法。第一个扩展变量$foo,并附加字符串-bar;第二个扩展为 的值$foo,或者如果未设置,则扩展为给定值bar

答案2

APOSIXshell 函数名称不能包含破折号:

[名称是]仅由可移植字符集中的下划线、数字和字母组成的单词。名称的第一个字符不是数字。

zshbashpdkshfish允许在函数名称中使用破折号,但ksh93dash不允许(并且fish实际上并不是一个 POSIX shell)。我认为谨慎的做法是避免函数名称中出现破折号。

变量和函数不共享命名空间,变量名称的 POSIX 命名规则与 POSIX shell 函数名称相同,而且我知道没有 shell 允许在变量名称中使用破折号。

脚本的名称中可以包含破折号,也可以包含除 nul 字符和 之外的任何其他字符/,因为它们是文件名。

答案3

是的,在 bash 中的函数名称中使用破折号是可以的。

这是一个例子使用带有破折号的函数名称的项目。

事实上,您可能觉得不寻常的其他字符也可能出现在函数名称中。这是同一项目中的另一个示例脚本,它使用::s 作为函数名称的一部分,作为某种命名空间。 (但请注意,后者使用下划线,而前者使用破折号,因此一致性不那么强......)

正如 @choroba 所提到的,函数名称和变量名称的命名空间是分开的,实际上不存在名称可以引用其中一个或另一个的情况,因此它们具有不同的允许字符集这一事实并不会真正创建任何名称名称仅作为其中之一有效而无效的问题。

相关内容