| 1 | #### var ref to array 'preHooks[@]' |
| 2 | # |
| 3 | # This idiom discussed on |
| 4 | # https://github.com/NixOS/nixpkgs/pull/147629 |
| 5 | |
| 6 | shopt -s eval_unsafe_arith 2>/dev/null # required for OSH |
| 7 | |
| 8 | show() { |
| 9 | echo show |
| 10 | |
| 11 | # These are actually different |
| 12 | argv.py ${!hooksSlice} |
| 13 | |
| 14 | argv.py ${!hooksSlice+"${!hooksSlice}"} |
| 15 | } |
| 16 | |
| 17 | hooksSlice='preHooks[@]' |
| 18 | |
| 19 | preHooks=() |
| 20 | show |
| 21 | |
| 22 | preHooks=('foo bar' baz) |
| 23 | show |
| 24 | |
| 25 | # WTF this exposes a difference? But not the test case below? |
| 26 | |
| 27 | # What's happening here? |
| 28 | # Uncomment this and get an error in bash about hookSlice, even though we never |
| 29 | # undefined it. |
| 30 | |
| 31 | #wtf=1 |
| 32 | # |
| 33 | # line 6: !hooksSlice: unbound variable |
| 34 | |
| 35 | if test -n "$wtf"; then |
| 36 | # 4.4.0(1)-release |
| 37 | # echo $BASH_VERSION |
| 38 | |
| 39 | set -u |
| 40 | preHooks=() |
| 41 | show |
| 42 | |
| 43 | preHooks=('foo bar' baz) |
| 44 | show |
| 45 | fi |
| 46 | |
| 47 | ## STDOUT: |
| 48 | show |
| 49 | [] |
| 50 | [] |
| 51 | show |
| 52 | ['foo', 'bar', 'baz'] |
| 53 | ['foo bar', 'baz'] |
| 54 | ## END |
| 55 | |
| 56 | #### Same as above with set -u |
| 57 | show() { |
| 58 | echo show |
| 59 | |
| 60 | # These are actually different |
| 61 | argv.py ${!hooksSlice} |
| 62 | |
| 63 | argv.py ${!hooksSlice+"${!hooksSlice}"} |
| 64 | } |
| 65 | |
| 66 | hooksSlice='preHooks[@]' |
| 67 | |
| 68 | set -u |
| 69 | preHooks=() |
| 70 | show |
| 71 | |
| 72 | preHooks=('foo bar' baz) |
| 73 | show |
| 74 | |
| 75 | ## STDOUT: |
| 76 | show |
| 77 | ## END |
| 78 | ## status: 1 |
| 79 | |
| 80 | |
| 81 | #### ${!ref} to undefined array |
| 82 | |
| 83 | set -u |
| 84 | shopt -s eval_unsafe_arith || true 2>/dev/null |
| 85 | |
| 86 | #preHooks=() |
| 87 | hookSlice="preHooks[@]" |
| 88 | |
| 89 | argv.py ${!hookSlice+"${!hookSlice}"} |
| 90 | |
| 91 | for element in ${!hookSlice+"${!hookSlice}"}; do |
| 92 | echo $element |
| 93 | done |
| 94 | |
| 95 | ## STDOUT: |
| 96 | [] |
| 97 | ## END |
| 98 | |
| 99 | #### ${!ref} to undefined string var is fatal, INCONSISTENT with array |
| 100 | hookSlice='preHooks' |
| 101 | |
| 102 | argv.py ${!hookSlice} |
| 103 | |
| 104 | set -u |
| 105 | |
| 106 | argv.py ${!hookSlice} |
| 107 | |
| 108 | echo end |
| 109 | |
| 110 | ## status: 1 |
| 111 | ## STDOUT: |
| 112 | [] |
| 113 | ## END |
| 114 | |
| 115 | #### export with dynamic var name += |
| 116 | |
| 117 | orig() { |
| 118 | export NIX_LDFLAGS${role_post}+=" -L$1/lib64" |
| 119 | } |
| 120 | |
| 121 | new() { |
| 122 | local var_name="NIX_LDFLAGS$role_post" |
| 123 | local value=" -L$1/lib64" |
| 124 | |
| 125 | eval "$var_name"+='$value' |
| 126 | export "$var_name" |
| 127 | } |
| 128 | |
| 129 | role_post='_foo' |
| 130 | |
| 131 | # set -u |
| 132 | |
| 133 | if test -n "${BASH_VERSION:-}"; then |
| 134 | orig one |
| 135 | fi |
| 136 | |
| 137 | declare -p NIX_LDFLAGS_foo # inspect it |
| 138 | unset NIX_LDFLAGS_foo |
| 139 | |
| 140 | new one |
| 141 | |
| 142 | declare -p NIX_LDFLAGS_foo # inspect it |
| 143 | |
| 144 | ## STDOUT: |
| 145 | declare -x NIX_LDFLAGS_foo=" -Lone/lib64" |
| 146 | declare -x NIX_LDFLAGS_foo=" -Lone/lib64" |
| 147 | ## END |
| 148 | ## OK osh STDOUT: |
| 149 | declare -x NIX_LDFLAGS_foo=' -Lone/lib64' |
| 150 | ## END |
| 151 |