bash shell 脚本函数定义(如“f () ”)中使用的括号是啥?它与使用“function”关键字不同吗?
Posted
技术标签:
【中文标题】bash shell 脚本函数定义(如“f () ”)中使用的括号是啥?它与使用“function”关键字不同吗?【英文标题】:What are the parentheses used for in a bash shell script function definition like "f () "? Is it different than using the "function" keyword?bash shell 脚本函数定义(如“f () ”)中使用的括号是什么?它与使用“function”关键字不同吗? 【发布时间】:2011-06-06 23:36:18 【问题描述】:我一直想知道它们是用来做什么的? 如果您永远无法将任何东西放入其中,那么每次都放入它们似乎很愚蠢。
function_name ()
#statements
将function
关键字放在函数的开头还有什么好处/损失?
function function_name ()
#statements
【问题讨论】:
【参考方案1】:没有function
,别名扩展会在定义时发生。例如:
alias a=b
# Gets expanded to "b() echo c; " :
a() echo c;
b
# => c
# Gets expanded to b:
a
# => c
但是对于function
,别名扩展不会在定义时发生,所以别名“隐藏”了定义:
alias a=b
function a echo c;
b
# => command not found
# Gets expanded to b:
a
# => command not found
unalias a
a
# => c
【讨论】:
这不是function
关键字的一个特性——它只是别名的工作方式,它们总是以它们的方式工作,单独在一行中的第一个单词上执行文本替换.如果有人创建了一个名为function
的别名,它仍然会在此处展开。【参考方案2】:
关键字function
已被弃用,取而代之的是function_name()
,以实现POSIX spec 的可移植性
函数是用户定义的名称 被用作一个简单的命令来调用 具有新位置的复合命令 参数。一个函数定义为 一个“函数定义命令”。
函数定义的格式 命令如下:
fname() compound-command[io-redirect ...]
请注意,
不是强制性的,因此如果您不打算使用关键字 function
(而且您不应该),那么 ()
是必需的,因此解析器知道您正在定义一个函数.
例如,这是一个合法的函数定义和调用:
$ myfunc() for arg; do echo "$arg"; done; myfunc foo bar
foo
bar
【讨论】:
没有括号怎么办?我以前见过function myfunc
。
@AaronFranke 只是定义函数的另一种方式,虽然我会说这种方式使用较少。【参考方案3】:
在您的第一个示例中需要空括号,以便 bash 知道它是一个函数定义(否则它看起来像一个普通命令)。在第二个示例中,()
是可选的,因为您使用了 function
。
【讨论】:
啊,好吧,猜猜是有道理的,它只是在 php 中你可以把东西放在括号内,所以我很好奇我是否可以在 linux 脚本中做类似的事情。 @Mint:括号内不能放任何东西,调用函数时也不会用到它们,但你仍然可以将位置参数传递给函数。foo () echo "$1"; ; foo hello
以上是关于bash shell 脚本函数定义(如“f () ”)中使用的括号是啥?它与使用“function”关键字不同吗?的主要内容,如果未能解决你的问题,请参考以下文章