为什么bash函数使用圆括号,如果它们从不填充参数?

时间:2015-06-08 15:06:51

标签: bash

各种语言的函数定义语法是:

C(所有脚本语言的教父):

func_type myfunc_c (arg_type arg_name , ...)
{
    /* arguments explicitly specified */
}

TCL:

proc myfunc_tcl {arg1 arg2 args} {
    # arguments explicitly specified
}

的Perl:

sub myfunc_perl {
    # no arguments explicitly specified && no round brackets used
}

的Python:

def myfunc_python(arg1, arg2):
    # arguments explicitly specified

击:

function myfunc_bash () {
    # arguments NEVER explicitly specified
    # WHY using round brackets?
}

为什么在bash中使用圆括号?

2 个答案:

答案 0 :(得分:9)

括号是可选的。来自Bash Reference Manual --> 3.3 Shell Functions

  

使用以下语法声明函数:

name () compound-command [ redirections ]
     

function name [()] compound-command [ redirections ]
     

这定义了一个名为name的shell函数。保留字功能   是可选的。 如果提供了function保留字,则为   括号是可选的。功能的主体是化合物   command compound-command(参见Compound命令)。那个命令是   通常是{和}之间的列表,但可以是任何化合物   上面列出的命令。只要名称是,就执行复合命令   指定为命令的名称。当shell处于POSIX模式时   (参见Bash POSIX模式),名称可能与其中一个特殊   builtins(见特别建筑)。任何重定向(请参阅重定向)   与函数关联的shell函数在执行时执行   执行。

所以这些是等价的:

function hello {
    echo "hello there"
}

hello () {
    echo "hello there"
}

在Bash中,函数可以正常访问全局变量,因此该方法与其他语言略有不同。通常,不需要使用return,因为没有值可以捕获。

查看示例。在这里,我们有一个包含值的全局变量myvar。在函数mytestmytest_inner中,我们正在更改其值。但是,在一种情况下,该值会影响全局环境,而另一种情况则不会。

mytest中,我们更改了值,它会影响主要块。在mytest_inner中我们也是这样做的,但是在函数中运行的子shell中,只是在本地更改了值。

#!/bin/bash

function mytest {
   echo "mytest -> myvar: $myvar"
   ((myvar++))
}

function mytest_inner () {
   (
   echo "mytest_inner -> myvar: $myvar"
   ((myvar++))
   )
}

myvar=$1
mytest
echo "main -> myvar: $myvar"
mytest_inner
echo "main -> myvar: $myvar"

让我们运行它:

$ ./myscript.sh 20
mytest -> myvar: 20
main -> myvar: 21
mytest_inner -> myvar: 21
main -> myvar: 21

答案 1 :(得分:5)

  

为什么在bash中使用圆括号?

实际上,他们并不需要,至少不是我的版本。

allRequirements

$ foo() { echo 'foo!' ; }

$ foo
foo!

$ function bar { echo 'bar!' ; }

$ bar
bar!

$ function baz() { echo 'baz!' ; }

$ baz
baz!

$ bash --version | head -n 1 GNU bash, version 4.2.25(1)-release (x86_64-pc-linux-gnu)

man bash