3

为什么shell不需要函数的参数?下面的加法函数示例将 num1 和 num2 相加。我的意思是你不要在行函数addition()的()里面写参数。

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

3 回答 3

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

于 2013-06-30T19:57:01.200 回答
1

从手册页:

当一个函数被执行时,函数的参数在其执行过程中成为位置参数。更新特殊参数 # 以反映更改。特殊参数 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 不支持关键字参数。

您可能还希望阅读手册页中位置参数下的部分。

于 2013-06-30T19:46:07.997 回答
1

Shell 函数不需要原型,因为

  • 所有变量都是字符串变量。它们会根据需要转换为数字,例如在进行算术运算时。(顺便说一句,将变量声明为整数是 POSIX 中没有的 shell 扩展)。
  • 当函数被调用并且可用时,传递的参数数量是已知的,$#因此函数体可以处理可变参数函数。
于 2013-06-30T21:03:33.723 回答