On 02/12/2018 10:03 AM, Clark Wang wrote:
On Mon, Feb 12, 2018 at 3:23 PM, Nikolai Kondrashov <spbn...@gmail.com 
<mailto:spbn...@gmail.com>> wrote:


        Take a look at these links:

           - http://wiki.bash-hackers.org/commands/builtin/unset 
<http://wiki.bash-hackers.org/commands/builtin/unset>
           - http://www.fvue.nl/wiki/Bash:_Passing_variables_by_reference 
<http://www.fvue.nl/wiki/Bash:_Passing_variables_by_reference>


    Thanks, Clark! However, I find it difficult to follow the explanation at the
    first link and even more difficult to connect it to this case. So I'm not 
sure
    I'm getting it right. Could you maybe explain what exactly happens in the 
code
    I posted?


Your code:

     inner() {
         unset res
         if [[ $1 == "set" ]]; then
             res[0]="X"
             res[1]="Y"
         fi
     }

     outer() {
         local res=
         inner "$1"
         echo "res: ${res[@]}"
     }

The "unset" in inner() actually unsets the "res" in outer() and the
following assignment (to res[0] and res[1]) is actually assigning to the
global var "res". And in outer(), after calling inner(), its local "res" is
gone and it also referencing to the global var "res".

With 2 "unset" commands, even the global "res" is unset.

Thank you, that explains it wonderfully. Sorry for being lazy and not figuring
it out myself. Now I need to craft a fix :)

Nick

Reply via email to