为什么bash函数使用圆括号,如果这些圆括号从来没有填充参数?

为什么bash函数使用圆括号,如果这些圆括号从来没有填充参数?,bash,Bash,各种语言的函数定义语法为: C(所有脚本语言的教父): func\u type myfunc(arg类型arg\u name,…) { /*明确指定的参数*/ } TCL: Perl: sub myfunc\u perl{ #没有明确指定参数&&没有使用圆括号 } Python: def myfunc_python(arg1、arg2): #明确指定的参数 狂欢节: 函数myfunc\u bash(){ #从未明确指定参数 #为什么使用圆括号? } 为什么在bash中使用圆括号 为什么在

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

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

func\u type myfunc(arg类型arg\u name,…)
{
/*明确指定的参数*/
}
TCL:

Perl:

sub myfunc\u perl{
#没有明确指定参数&&没有使用圆括号
}
Python:

def myfunc_python(arg1、arg2):
#明确指定的参数
狂欢节:

函数myfunc\u bash(){ #从未明确指定参数 #为什么使用圆括号? } 为什么在bash中使用圆括号

为什么在bash中使用圆括号

事实上,它们不需要,至少在我的版本中不需要

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

$ foo
foo!

$ function bar { echo 'bar!' ; }

$ bar
bar!

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

$ baz
baz!

manbash

Shell函数定义
shell函数是一个像简单命令一样调用并执行复合命令的对象
具有一组新的位置参数的命令。Shell函数声明如下:
name()复合命令[重定向]
函数名[()]复合命令[重定向]
这定义了一个名为name的函数。保留字功能是可选的。如果
提供了功能保留字,括号是可选的。主体
该功能是复合命令复合命令(请参见复合命令
上文)。该命令通常是介于{和}之间的命令列表,但可以是任意命令
上面的复合命令下列出的命令。复合命令在以下情况下执行:-
将ever name指定为简单命令的名称。任何重定向(请参阅-
定义函数时指定的方向)在函数-
执行了一个命令。函数定义的退出状态为零,除非语法错误
发生错误或已存在同名的只读函数。当exe-
剪切时,函数的退出状态是最后一个命令exe的退出状态-
身体上的伤口。(请参见下面的功能。)

括号是可选的。发件人:

函数是使用以下语法声明的:

name () compound-command [ redirections ]

function name [()] compound-command [ redirections ]
这定义了一个名为name的shell函数。保留字函数 是可选的如果提供了
功能
保留字,则 括号是可选的
。函数的主体是化合物 命令复合命令(请参见复合命令)。这个命令是 通常是{和}之间的列表,但可以是任何化合物 上面列出的命令。只要输入名称,就会执行复合命令 指定为命令的名称。当shell处于POSIX模式时 (参见Bash POSIX模式),名称可能与其中一个特殊的 内置(参见专用内置)。任何重定向(请参阅重定向) 与外壳函数相关联的操作将在调用该函数时执行 执行

所以这些是等价的:

function hello {
    echo "hello there"
}

hello () {
    echo "hello there"
}
在Bash中,函数可以正常地访问全局变量,因此这种方法与其他语言略有不同。通常,不需要使用
return
,因为没有要捕获的值

请看一个例子。这里,我们有一个全局变量
myvar
,包含一个值。在函数
mytest
mytest\u inner
中,我们正在更改其值。但是,在一种情况下,该值会影响全球环境,而在另一种情况下则不会

mytest
中,我们更改值,它会影响主块。在
mytest\u internal
中,我们也这样做,但值只是在函数中运行的子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

你对C语言的描述会让很多人感到不安:)它说在bash中必须有括号在哪里?..@Pynchia:我添加了[c]标签以抵消反对票我不会放弃我的信仰!!:D Martijn Pieters&&ThisSuitesBlacknot:谢谢你们提供的宝贵信息,伙计们!posixshell需要()但bash允许使用
函数
关键字。两者都不需要{}。(正文需要是复合命令。请尝试此操作,例如:
f()用于;do echo参数“$a”;done
如果您问为什么POSIX标准要求它们,而Bash没有,尤其是当它们似乎没有功能时,可能会更好。它们与函数一起出现在20世纪80年代的Bourne shell中,但我找不到任何理由。我选择这个答案,因为引用了
Bash参考手册
。我看不出这个问题和子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