如何'释放'分配给外壳中变量的内存

问题描述:

function mem(){ 
local token 
return $token 
} 

obj=$(ls)      #list of object name 
objstr=($obj)     #array[i] whose ith element is object name 
objno=$(echo "$obj" | wc -w) #the number of object name 

for i in $(seq 0 $(($objno-1))) 
do 
    objID=${objstr[$i]} #object name 
    IDlen=${#objID}  #length of object name 
    for j in $(seq 0 $(($IDlen-1))) 
    do 
     subID=${objID:$j:1}  #charater in the name 
     token=$(mem)    #allocate local variable returned 
     token[0]+=$subID   #concatenate characters 
    done 

我想定义一个变量,我可以在其中存储对象名称。 (以我可以访问名称中的每个字符的方式) 但最重要的是它必须是一次性的。 在继续使用另一个对象名称以最小化开销之前,我想'释放'分配给该变量的内存。 所以我定义了一个函数mem(),它将返回局部变量。 如果我在每次使用它之前将令牌[0]初始化为返回的变量, 先前分配给变量的内存会发生什么变化?它是否按预期“释放”?如何'释放'分配给外壳中变量的内存

+0

'return'需要一个数字。 – melpomene

+0

'$ token'不是一个数字。它是空的,所以'return $ token'就是'return'。一个简单的'return'使用函数中执行的最后一个命令的退出状态。没有一个,所以我的猜测是'mem'等价于'function mem(){return 0; }'。 – melpomene

+0

使用* $ IDlen *变量,但未在上面的代码中定义。 – agc

你不在shell中释放内存;没有明确的方法来释放诸如变量存储之类的东西。也就是说,你可以试试

  • 如果你的shell支持它们,使用局部变量;当他们走出去的范围
  • unset NAME一旦你与NAME

注意,就像在C,这并不能保证内存返回到OS做,他们可能会被释放。

但是,然后,为什么你首先担心shell变量的内存?你的实际的问题是什么?如果内存使用和管理是一个限制,那么shell可能是错误的工具?

+0

我需要更改给定目录中的所有对象,包括其子目录中的所有对象。我需要使用递归函数,我想如果我没有释放内存,那么当我尝试将这个脚本应用于大量文件时,我可能会遇到一些错误 –

+0

我尝试了局部变量,它的工作原理。但根据: http://tldp.org/LDP/abs/html/localvar.html, 在函数中声明的局部变量对父函数调用的函数也是可见的。这意味着如果我在递归函数中使用局部变量,它很可能留在内存中,直到它所调用的所有递归子结束为止。 –

+0

unset命令 - 它取消设置shell变量,将其从内存和shell的导出环境中删除。 -wikipedia非常感谢! - –