如何'释放'分配给外壳中变量的内存
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]初始化为返回的变量, 先前分配给变量的内存会发生什么变化?它是否按预期“释放”?如何'释放'分配给外壳中变量的内存
你不在shell中释放内存;没有明确的方法来释放诸如变量存储之类的东西。也就是说,你可以试试
- 如果你的shell支持它们,使用局部变量;当他们走出去的范围
-
unset NAME
一旦你与NAME
注意,就像在C,这并不能保证内存返回到OS做,他们可能会被释放。
但是,然后,为什么你首先担心shell变量的内存?你的实际的问题是什么?如果内存使用和管理是一个限制,那么shell可能是错误的工具?
我需要更改给定目录中的所有对象,包括其子目录中的所有对象。我需要使用递归函数,我想如果我没有释放内存,那么当我尝试将这个脚本应用于大量文件时,我可能会遇到一些错误 –
我尝试了局部变量,它的工作原理。但根据: http://tldp.org/LDP/abs/html/localvar.html, 在函数中声明的局部变量对父函数调用的函数也是可见的。这意味着如果我在递归函数中使用局部变量,它很可能留在内存中,直到它所调用的所有递归子结束为止。 –
unset命令 - 它取消设置shell变量,将其从内存和shell的导出环境中删除。 -wikipedia非常感谢! - –
'return'需要一个数字。 – melpomene
'$ token'不是一个数字。它是空的,所以'return $ token'就是'return'。一个简单的'return'使用函数中执行的最后一个命令的退出状态。没有一个,所以我的猜测是'mem'等价于'function mem(){return 0; }'。 – melpomene
使用* $ IDlen *变量,但未在上面的代码中定义。 – agc