The following macros declare local and global variables we can use with the NAMEREF mechanism.  All
the variables declared with the macros below can be unset using mbfl_unset_varref(); for
details Unsetting NAMEREF declarations.  When defining array variables we
can use specific macros, rather than the ones below; Declaring arrays as
variable references.
A use of this macro expands into:
declare mbfl_a_variable_NAME mbfl_variable_alloc mbfl_a_variable_NAME declare DECLARE_OPTIONS $mbfl_a_variable_NAME declare -n NAME=$mbfl_a_variable_NAME
When INIT_VALUE is empty, it finishes with:
NAME=
which defines the variable and causes test -v VARNAME to return true; defining the
variable this way works with scalar variables, but defines an array variables as containing an
element with key ‘0’, which is probably not what we want.
When INIT_VALUE is not empty, it finishes with:
NAME=INIT_VALUE
A name variable mbfl_a_variable_NAME is declared and filled with a unique
data variable name by mbfl_variable_alloc(); then the data variable is declared;
finally a proxy variable NAME is defined as alias for the data variable.  If the
macro is used at top–level: the variables are global.
We can use the argument DECLARE_OPTIONS to declare a global data variable:
mbfl_declare_varref(VARNAME, INIT_VALUE, -g)
Like mbfl_declare_varref() but always include the option -g.  Its expansion is:
mbfl_declare_global_varref(NAME, INIT_VALUE, OPTIONS) → mbfl_declare_varref(NAME, INIT_VALUE, -g OPTIONS)
With these macros it is not possible to declare a read–only array; the macro use:
mbfl_declare_varref(ARRY, ([a]=1), -rA)
expands into:
declare mbfl_a_variable_ARRY mbfl_variable_alloc mbfl_a_variable_ARRY declare -rA $mbfl_a_variable_ARRY declare -n ARRY=$mbfl_a_variable_ARRY ARRY=([a]=1)
so when the array is initialised it has already been declared as read–only: an error results. It is not possible to modify this macro to allow such declaration, because, while this syntax works:
declare -rA ARRY=([a]=1)
the following is invalid according to Bash:
declare -rA $mbfl_a_variable_ARRY=([a]=1)
A use of this macro expands into:
declare mbfl_a_variable_NAME=DATA_VARNAME_EXPR declare -n NAME=$mbfl_a_variable_NAME
Declare a proxy variable NAME aliasing the data variable whose value is the result of evaluating DATA_VARNAME_EXPR.
NOTE We cannot declare
mbfl_a_variable_NAMEas read–only because the we cannot unset it.
We can use this macro as follows:
function main () {
    declare VARNAME
    worker VARNAME
    mbfl_declare_nameref(VAR, $VARNAME)
    ...
}
function worker () {
    mbfl_mandatory_nameref_parameter(RV, 1)
    mbfl_declare_varref(VAR, 123, -g)
    RV=mbfl_datavar(VAR)
}
main
This document describes version 3.0.0-devel.9 of Marcos Bash Functions Library.