为什么bash函数使用圆括号,如果这些圆括号从来没有填充参数?
各种语言的函数定义语法为: C(所有脚本语言的教父):为什么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中使用圆括号 为什么在
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