Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

In bash, should I unset a local variable inside a function?

Tags:

linux

bash

unix

Should I unset my local variables at the end of a function in a bash script? As an example, the following function:

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

Just curious about best practices, thanks!

like image 681
chechuchechango Avatar asked Feb 05 '16 06:02

chechuchechango


People also ask

Which type of variable we Cannot unset in shell script?

You cannot use the unset command to unset variables that are marked readonly.

Are bash function variables local?

echo exit 0 # In contrast to C, a Bash variable declared inside a function #+ is local ONLY if declared as such. Before a function is called, all variables declared within the function are invisible outside the body of the function, not just those explicitly declared as local.


2 Answers

If you weren't using the local command, then you would want to unset the variable before leaving the function to avoid polluting the global namespace.

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
}

The problem with that approach is that square doesn't know if it actually created var in the first place. It may have overwritten and ultimately unset a global variable that was in use before square was called.

Using local, you are guaranteed to create a new variable that is only visible inside the function. If there were a global var, it's value is ignored for the duration of the function. When the function exits, the local var is discarded, and the global var (if any) can be used as before.

$ var=3
$ echo $var
3
$ square 9
81
$ echo $var
3
like image 146
chepner Avatar answered Sep 30 '22 18:09

chepner


If that comment ## should I unset $var here?? is the end of your subroutine, you would not need to unset it, because it would go out of scope right after that anyway.

like image 20
Jorge Torres Avatar answered Sep 30 '22 17:09

Jorge Torres