f() { local str=F g str } g() { local -n ref=$1 printf "%s " "$ref" ref=G } str=OUTSIDE; f printf "%s\n" "$str" unset -f f g unset str f() { local -a arr=(F); g arr; }; g() { local -n ref=$1; printf "%s " "${ref[0]}"; ref=(G); }; arr=(OUTSIDE); f; printf "%s\n" "${arr[0]}"