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”关键字不同吗?的主要内容,如果未能解决你的问题,请参考以下文章

shell脚本调试

Bash脚本之函数定义和调用

shell脚本第一行带了磨人的小-f

Shell bash 脚本 简介

Linux shell脚本编程

shell脚本