在bash中,我应该在函数内部取消设置局部变量吗?

时间:2016-02-05 06:12:05

标签: linux bash unix

我应该在bash脚本中的函数末尾取消设置我的局部变量吗? 例如,以下功能:

square()
{
  local var=$1
  (( var = var * var ))
  echo $var
  ## should I unset $var here??
}

对最佳做法感到好奇,谢谢!

2 个答案:

答案 0 :(得分:4)

如果您没有使用local命令,那么您可能希望在离开函数之前取消设置变量,以避免污染全局命名空间。

square () {
    var=$1    # var is global, and could be used after square returns
    (( var = var * var ))
    echo $var
    unset var  # Remove it from the global namespace
}

该方法的问题在于square首先不知道它是否实际创建 var。它可能已被覆盖并最终取消设置在square被调用之前使用的全局变量。

使用local,您可以保证创建一个仅在函数内可见的 new 变量。如果存在全局var,则在函数持续时间内忽略它的值。当函数退出时,将丢弃本地var,并且可以像以前一样使用全局var(如果有)。

$ var=3
$ echo $var
3
$ square 9
81
$ echo $var
3

答案 1 :(得分:2)

如果该注释## should I unset $var here??是你的子程序的结束,你就不需要取消它,因为它会在那之后就超出范围。