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