foo() { local var=1 bar var } bar(string ref) { local var=2 eval "${ref}=3" } foo() { local var=1 bar &var } bar(string ref) { local var=2 !ref=3 } __ref() { __var=${1} case " ${__fn_vars} " in *" ${__var} "*) printf '__fn_vars_%d_%s' ${__sp} "${__var}" return 0 ;; esac eval "__val=\${__${__prev_tu}_static_vars}" case " ${__val} " in *" ${__var} "*) printf '__fn_vars_%d_%s' ${__sp} "${__var}" return 0 ;; esac } __derefset() { __var=${1} case "${__var}" in *[!A-Za-z0-9_]*) printf 'Error: Invalid reference variable\n' >&2 exit 1 ;; '__fn_vars_'[A-Za-z_]*) ;; *) printf 'Error: Invalid reference variable\n' >&2 exit 1 ;; esac eval "printf '%s' \${${__var#__fn_vars_}}" }