| # This program is free software: you can redistribute it and/or modify |
| # it under the terms of the GNU General Public License as published by |
| # the Free Software Foundation, either version 3 of the License, or |
| # (at your option) any later version. |
| # |
| # This program is distributed in the hope that it will be useful, |
| # but WITHOUT ANY WARRANTY; without even the implied warranty of |
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| # GNU General Public License for more details. |
| # |
| # You should have received a copy of the GNU General Public License |
| # along with this program. If not, see <http://www.gnu.org/licenses/>. |
| # |
| # test behavior of readonly namerefs and namerefs referencing readonly variables |
| |
| # readonly nameref variable referencing read-write global variable |
| |
| bar=one |
| declare -rn foo0=bar |
| unset foo0 # unsets bar |
| declare -p bar |
| unset -n foo0 # cannot unset |
| declare -p foo0 |
| |
| declare +r foo0 # modifies bar |
| declare -p foo0 bar |
| declare +r -n foo0 # error |
| declare +n foo0 # error |
| unset bar |
| |
| # readonly nameref variable without a value |
| typeset -n foo1 |
| typeset -r foo1 |
| |
| typeset -p foo1 |
| |
| typeset foo1=bar # error |
| typeset +r foo1 # no-op, follows nameref chain to nothing |
| typeset -p foo1 |
| |
| # nameref pointing to read-only global variable |
| foo2=bar |
| typeset -n foo2 |
| typeset -r foo2 # changes bar |
| |
| typeset -p foo2 bar |
| |
| foo2=bar # error? |
| typeset +r foo2 # attempts to change bar, error |
| typeset -p foo2 bar # nameref unchanged |
| |
| # read-only nameref pointing to read-only global variable |
| bar3=three |
| declare -rn foo3=bar3 |
| unset foo3 # unsets bar3 |
| |
| bar3=three |
| declare -p bar3 |
| unset -n foo3 # cannot unset |
| |
| readonly bar3 |
| declare +r foo3 # error attempting to reference bar3 |
| declare -p foo3 bar3 |
| declare +r -n foo3 # error |
| |
| # readonly nameref pointing to read-write local -- can we remove nameref attr? |
| func() |
| { |
| typeset bar4=four |
| |
| # readonly nameref |
| typeset -n -r foo4=bar4 |
| |
| typeset -p foo4 bar4 |
| |
| typeset +n foo4 |
| |
| typeset -p foo4 |
| } |
| func |
| unset -f func |
| |
| # readonly nameref pointing to read-write global -- can we remove nameref attr? |
| bar4=four |
| foo4=bar4 |
| # readonly nameref |
| typeset -n foo4 |
| typeset -r -n foo4 |
| |
| typeset -p foo4 bar4 |
| |
| typeset +n foo4 |
| typeset -p foo4 |
| |
| bar4=four |
| : ${foo4=bar4} |
| |
| typeset -p foo4 bar4 |
| |
| # readonly local nameref without a value -- can we remove nameref attribute? |
| func() |
| { |
| declare -r -n foo5 |
| declare -p foo5 |
| declare +n foo5 |
| declare -p foo5 |
| } |
| func |
| unset -f func |
| |
| # readonly global nameref without a value -- can we remove nameref attribute? |
| declare -n foo5 |
| declare -r -n foo5 |
| declare -p foo5 |
| declare +n foo5 |
| declare -p foo5 |