您可以通过多种方式编写bash函数:
function JoinStrings {
...;
}
或者
function JoinStrings () {
...;
}
或者
JoinStrings () {
...;
}
这些功能有什么区别吗?为什么在bash中有3种不同的方法来编写函数? (有更多方法可以编写函数吗?)
答案 0 :(得分:1)
function name {}
与function name() {}
相同。我可以想到的function name
和name()
之间的唯一区别是,如果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
语法 在调用者的环境中执行并共享所有变量和陷阱 与来电者。这些函数执行中的错误导致 包含它们的脚本将中止。