写`function Name {...; }`,`Name(){...; }`和`函数Name(){...;在bash中

时间:2015-12-04 00:39:51

标签: bash function shell command-line

您可以通过多种方式编写bash函数:

function JoinStrings {
    ...;
}

或者

function JoinStrings () {
    ...;
}

或者

JoinStrings () {
    ...;
}

这些功能有什么区别吗?为什么在bash中有3种不同的方法来编写函数? (有更多方法可以编写函数吗?)

1 个答案:

答案 0 :(得分:1)

function name {}function name() {}相同。我可以想到的function namename()之间的唯一区别是,如果name()是别名,name可能会被别名扩展。例如:

[STEP 100] # echo $BASH_VERSION
4.3.30(1)-release
[STEP 101] # cat func.sh
shopt -s expand_aliases

alias foo=bar

# this will define a function named `foo'
function foo()
{
    echo $FUNCNAME
}

# this will define a function named `bar'
foo()
{
    echo $FUNCNAME
}

unalias foo
foo
bar
[STEP 102] # bash func.sh
foo
bar
[STEP 103] #

顺便在ksh中,function name {}name() {}非常不同。根据{{​​1}}手册:

  

由于历史原因,有两种方法可以定义函数,即   ksh语法和name()语法,...

     

function name语法定义并由function name调用的函数执行   在与调用者相同的过程中并共享所有文件并呈现   与调用者的工作目录。调用者捕获的陷阱是   重置为函数内的默认操作。陷阱条件   未被函数捕获或忽略的函数会导致函数   终止并将条件传递给调用者。一个陷阱   函数内部的EXIT设置在调用者的环境中执行   功能完成后。通常,变量之间是共享的   调用程序和功能。但是,排版特别   函数内使用的内置命令定义其局部变量   范围包括当前功能。它们可以传递给函数   他们在调用之前调用变量赋值列表   或作为名称引用传递的参数。功能中的错误   将控制权交还给来电者。

     

使用name语法和函数定义的函数   使用name()特殊内置函数调用的function name语法   在调用者的环境中执行并共享所有变量和陷阱   与来电者。这些函数执行中的错误导致   包含它们的脚本将中止。