为什么shell不需要函数的参数?下面的加法函数示例将 num1 和 num2 相加。我的意思是你不要在行函数addition()的()里面写参数。
addition()
{
echo $(($num1+$num2))
}
如果你的问题是这个函数为什么起作用,它是如何获得 num1 和 num2 变量的?”,答案是:它从父上下文中获取这些变量,例如这将回显hello Jack
:
hello() {
echo hello $name
}
name=Jack
hello
您可以重写函数以使用如下位置参数:
hello() {
echo hello $1
}
hello Jack
根据为什么不在函数声明中写变量名:这就是方法bash
。从手册页:
Shell Function Definitions
A shell function is an object that is called like a simple command and
executes a compound command with a new set of positional parameters.
Shell functions are declared as follows:
name () compound-command [redirection]
function name [()] compound-command [redirection]
This defines a function named name. The reserved word function
is optional. If the function reserved word is supplied, the
parentheses are optional. The body of the function is the com‐
pound command compound-command (see Compound Commands above).
....
也就是说,函数声明必须采用解释的形式之一,在不使用关键字()
时(中间没有变量名)是强制性的,否则是可选的。function
从手册页:
当一个函数被执行时,函数的参数在其执行过程中成为位置参数。更新特殊参数 # 以反映更改。特殊参数 0 不变。
在 CS 术语中,bash 函数不使用形式参数,因为位置参数总是在(且仅当)您应用函数时设置:
$ ##
$ # Show the function arguments
$ showParams() {
> printf '%s\n' "$@"
$ }
$ showParams 1 2 3
1
2
3
$ set -- 1 2 3
$ printf '%s\n' "$@"
1
2
3
$ showParams # Here you can see the parameters in the shell are not set in the function application:
$
…但这也意味着 bash 不支持关键字参数。
您可能还希望阅读手册页中位置参数下的部分。
Shell 函数不需要原型,因为
$#
因此函数体可以处理可变参数函数。