Arrays Bash,在递归中使用相同的变量

Arrays Bash,在递归中使用相同的变量,arrays,linux,bash,recursion,directory,Arrays,Linux,Bash,Recursion,Directory,我正在为Uni解决的一个问题是在一个目录中移动并计算所有文件和目录以及子目录中的文件和目录。我不能使用命令find、locate、du或任何递归命令,如ls-R。为了解决这个问题,我正在创建自己的递归命令。我遇到了一个问题,即在每个递归中使用相同的数组,现在使用java之类的东西,递归将使用不同的id分配递归中的每个变量。但这里使用的是相同的变量。我可以从我的输出中看出这一点,它从超级目录打印出目录,而不是当前使用的目录。使用的层次结构是,我得到的输出是 考虑一个更简单的复制器: foo() {

我正在为Uni解决的一个问题是在一个目录中移动并计算所有文件和目录以及子目录中的文件和目录。我不能使用命令find、locate、du或任何递归命令,如ls-R。为了解决这个问题,我正在创建自己的递归命令。我遇到了一个问题,即在每个递归中使用相同的数组,现在使用java之类的东西,递归将使用不同的id分配递归中的每个变量。但这里使用的是相同的变量。我可以从我的输出中看出这一点,它从超级目录打印出目录,而不是当前使用的目录。使用的层次结构是,我得到的输出是


考虑一个更简单的复制器:

foo() {
  var=$1
  (( var > 10 )) && return
  foo "$(( $var * 2 ))"
  echo "Passed $var"
}

( foo 1 )
因为shell中的所有变量都是全局变量,除非另有明确声明,只要使用
var=$1
,就会发出:

Passed 16
Passed 16
Passed 16
Passed 16
使用
local var
declare var
,这将正确地发出:

Passed 8
Passed 4
Passed 2
Passed 1

根据,您应该使用
local
目录声明为局部变量。如果ommited,变量将是全局变量。试试看。

如果你在使用bash,我想
local
关键字就是你的朋友。声明你的本地人!而且,说真的,你不能制造一个三线复制机?这是远远超过问题要求的代码;看。同意,很高兴看到一些代码,您显然已经尝试解决了您的问题,但如果我们不被代码中的其他内容分散注意力,我们可以更容易地帮助您。顺便说一句,您的原始问题中还有其他错误会自动发现。不仅是
目录
--而且
curdir
noDir
i
,以及所有其他变量。顺便说一句,我强烈建议您避免将ABS作为参考;虽然它确实有大量的谷歌果汁,但它经常在例子中使用不好的做法;我们这些花时间在freenode的bash频道的人,常常肩负着帮助人们忘记在那里学到的坏习惯的重任problem@CharlesDuffy哇,很高兴知道这一点。我会记住的,谢谢。
Passed 8
Passed 4
Passed 2
Passed 1