我有一个函数可以对它自己进行多次调用,但它确实接近它的终止值。例如
function multi () {
a = $1
b = $2
c = a + b
if [[ a > 2 ]]
then
let "$a = $a -1"
multi $a $b
fi
}
当它调用multi时,新的子函数使用旧的变量
答案 0 :(得分:2)
隐式创建的变量对于当前shell是全局的 - 因此,函数的每次递归都将覆盖相同的全局变量。
使用local
声明变量,使其成为函数的本地变量(调用)。
也就是说,你的功能存在多个问题(如果你真的使用bash
,你的功能根本就不应该执行):
=
周围不得有空格(除非在((...))
内)c = a + b
等算术表达式必须在((...))
>
内执行与((...))
的数字比较(或者,[[ ... ]]
使用-gt
,但您的变量引用必须为$
- 前缀)$
的作业的左侧使用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"