当递归调用时,bash函数是否会创建自身的新实例?

时间:2014-06-12 19:59:48

标签: bash shell recursion

我有一个函数可以对它自己进行多次调用,但它确实接近它的终止值。例如

function multi () {
    a = $1
    b = $2
    c = a + b
    if [[ a > 2 ]]
    then
        let "$a = $a -1"
        multi $a $b
    fi
}

当它调用multi时,新的子函数使用旧的变量

2 个答案:

答案 0 :(得分:2)

隐式创建的变量对于当前shell是全局的 - 因此,函数的每次递归都将覆盖相同的全局变量。

使用local声明变量,使其成为函数的本地变量(调用)。

也就是说,你的功能存在多个问题(如果你真的使用bash,你的功能根本就不应该执行):

  • 变量分配的=周围不得有空格(除非在((...))内)
  • c = a + b等算术表达式必须在((...))
  • 中执行
  • 必须在>内执行与((...))的数字比较(或者,[[ ... ]]使用-gt,但您的变量引用必须为$ - 前缀)
  • 正如@Florin Stingaciu在答案中指出的那样,你不能在传递给$的作业的左侧使用let前缀 - 但是,最好在这里使用((...))另外,因为它简化了事情:let "a = $a -1"只是变成(( --a ))

通常,在http://shellcheck.net粘贴代码会显示这些问题。

这是一个有效的版本:

function multi() {
    local a b c  # declare variables as _local_
    a=$1
    b=$2
    (( c = a + b ))
    if (( a > 2 ))
    then
      (( --a ))
      multi $a $b
    fi
}

答案 1 :(得分:0)

这是因为你有几个错误。这是工作版本:

function multi () {
  a=$1
  b=$2
  c=a+b
  if [[ $a -gt 2 ]]
  then
    let "a = $a -1"
    multi $a $b
  fi
}

你有

if [[ a > 2 ]]

什么时候应该:

if [[ $a -gt 2 ]]

let语句也是错误的。它应该是:

let "a = $a -1"