为什么shell不需要函数签名中的正式参数?

时间:2013-06-30 19:43:15

标签: shell unix

为什么shell不需要函数参数? 添加功能的示例如下,添加num1和num2。 我的意思是你不在行函数addition()的()中写入参数。

addition()
{
  echo $(($num1+$num2))
}

3 个答案:

答案 0 :(得分:2)

如果你的问题是为什么这个函数有效,它如何得到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(中间没有变量名称),否则可选。

答案 1 :(得分:1)

从联系手册:

  

执行函数时,函数的参数将成为执行期间的位置参数。更新特殊参数#以反映更改。特殊参数0不变。

在CS术语中,bash函数不使用formal parameters,因为位置参数总是在应用函数时(并且仅在何时)设置:

$ ##
$ # 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不支持关键字参数。

您可能还希望阅读联机帮助页中位置参数下的部分。

答案 2 :(得分:1)

Shell函数不需要原型,因为

  • 所有变量都是字符串变量。它们根据需要转换为数字,例如做算术的时候。 (顺便说一句,将变量声明为整数是POSIX中找不到的shell扩展名。)
  • 调用函数时,传递的参数数量是已知的,并且可用作$#,因此函数体可以处理可变函数。