【问题标题】: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
}

【问题讨论】:

    标签: linux bash function parentheses


    【解决方案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
    猜你喜欢
    • 2011-12-16
    • 2013-01-17
    • 2011-05-30
    • 2019-10-21
    • 1970-01-01
    • 2019-05-05
    • 1970-01-01
    • 2023-03-17
    相关资源
    最近更新 更多