各种语言的函数定义语法是:
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中使用圆括号?
答案 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
。在函数mytest
和mytest_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