Cyker
Cyker

Reputation: 10904

Bash: Hide global variable using local variable with same name

I'd like to use a global variable in a function but don't want the change to go outside the function. So I defined a local variable initialized to the value of the global variable. The global variable has a great name, so I want to use the same name on the local variable. This seems doable in Bash, but I'm not sure if this is undefined behavior.

#!/bin/bash

a=3
echo $a
foo() {
    local a=$a  ##  defined or undefined?
    a=4
    echo $a
}
foo
echo $a

Gives output:

3
4
3

Upvotes: 2

Views: 1305

Answers (2)

Benjamin W.
Benjamin W.

Reputation: 52112

There is a new shell option in Bash 5.0, localvar_inherit, to have local variables with the same name inherit the value of a variable with the same name in the preceding scope:

#!/usr/bin/env bash

shopt -s localvar_inherit

myfunc() {
    local globalvar
    echo "In call: $globalvar"
    globalvar='local'
    echo "In call, after setting: $globalvar"
}

globalvar='global'
echo "Before call: $globalvar"
myfunc
echo "After call: $globalvar"

with the following output:

Before call: global
In call: global
In call, after setting: local
After call: global

If you don't have Bash 5.0, you have to set the value in the function, as you did in your question, with the same result.

Upvotes: 2

Ondrej K.
Ondrej K.

Reputation: 9664

Expansion happen before assignment (early on) as the documentation states:

Expansion is performed on the command line after it has been split into words.

So the behavior should be predictable (and defined). In local a=$a when expanding $a it's still the global one. The command execution (assignment/declaration) happens later (when $a has already been replaced by its value).

However I am not sure this would not get confusing to have essentially two different variables (scope dependent) with the same name (i.e. appearing to be the one and same). So, I'd rather question wisdom of doing so on coding practices / readability / ease of navigation grounds.

Upvotes: 5

Related Questions