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

che*_*ngo 7 unix linux bash

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

square()
{
  local var=$1
  (( var = var * var ))
  echo $var
  ## should I unset $var here??
}
Run Code Online (Sandbox Code Playgroud)

只是对最佳实践感到好奇,谢谢!

che*_*ner 8

如果您没有使用该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
}
Run Code Online (Sandbox Code Playgroud)

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

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

$ var=3
$ echo $var
3
$ square 9
81
$ echo $var
3
Run Code Online (Sandbox Code Playgroud)