1 #### Lower Case with , and ,,
2 x='ABC DEF'
3 echo ${x,}
4 echo ${x,,}
5 echo empty=${empty,}
6 echo empty=${empty,,}
7 ## STDOUT:
8 aBC DEF
9 abc def
10 empty=
11 empty=
12 ## END
13
14 #### Upper Case with ^ and ^^
15 x='abc def'
16 echo ${x^}
17 echo ${x^^}
18 echo empty=${empty^}
19 echo empty=${empty^^}
20 ## STDOUT:
21 Abc def
22 ABC DEF
23 empty=
24 empty=
25 ## END
26
27 #### Lower Case with constant string (VERY WEIRD)
28 x='AAA ABC DEF'
29 echo ${x,A}
30 echo ${x,,A} # replaces every A only?
31 ## STDOUT:
32 aAA ABC DEF
33 aaa aBC DEF
34 ## END
35
36 #### Lower Case glob
37 x='ABC DEF'
38 echo ${x,[d-f]}
39 echo ${x,,[d-f]} # This seems buggy, it doesn't include F?
40 ## STDOUT:
41 ABC DEF
42 ABC deF
43 ## END
44
45 #### ${x@Q}
46 x="FOO'BAR spam\"eggs"
47 eval "new=${x@Q}"
48 test "$x" = "$new" && echo OK
49 ## STDOUT:
50 OK
51 ## END
52
53 #### ${array@Q} and ${array[@]@Q}
54 array=(x 'y\nz')
55 echo ${array[@]@Q}
56 shopt -s compat_array
57 echo ${array@Q}
58 shopt -u compat_array
59 echo ${array@Q}
60 ## STDOUT:
61 'x' 'y\nz'
62 'x'
63 'x'
64 ## END
65 ## OK osh status: 1
66 ## OK osh STDOUT:
67 x $'y\\nz'
68 x
69 ## END
70
71 #### ${!prefix@} ${!prefix*} yields sorted array of var names
72 ZOO=zoo
73 ZIP=zip
74 ZOOM='one two'
75 Z='three four'
76
77 z=lower
78
79 argv.py ${!Z*}
80 argv.py ${!Z@}
81 argv.py "${!Z*}"
82 argv.py "${!Z@}"
83 for i in 1 2; do argv.py ${!Z*} ; done
84 for i in 1 2; do argv.py ${!Z@} ; done
85 for i in 1 2; do argv.py "${!Z*}"; done
86 for i in 1 2; do argv.py "${!Z@}"; done
87 ## STDOUT:
88 ['Z', 'ZIP', 'ZOO', 'ZOOM']
89 ['Z', 'ZIP', 'ZOO', 'ZOOM']
90 ['Z ZIP ZOO ZOOM']
91 ['Z', 'ZIP', 'ZOO', 'ZOOM']
92 ['Z', 'ZIP', 'ZOO', 'ZOOM']
93 ['Z', 'ZIP', 'ZOO', 'ZOOM']
94 ['Z', 'ZIP', 'ZOO', 'ZOOM']
95 ['Z', 'ZIP', 'ZOO', 'ZOOM']
96 ['Z ZIP ZOO ZOOM']
97 ['Z ZIP ZOO ZOOM']
98 ['Z', 'ZIP', 'ZOO', 'ZOOM']
99 ['Z', 'ZIP', 'ZOO', 'ZOOM']
100 ## END
101
102 #### ${!prefix@} matches var name (regression)
103 hello1=1 hello2=2 hello3=3
104 echo ${!hello@}
105 hello=()
106 echo ${!hello@}
107 ## STDOUT:
108 hello1 hello2 hello3
109 hello hello1 hello2 hello3
110 ## END
111
112 #### ${var@a} for attributes
113 array=(one two)
114 echo ${array@a}
115 declare -r array=(one two)
116 echo ${array@a}
117 declare -rx PYTHONPATH=hi
118 echo ${PYTHONPATH@a}
119
120 # bash and osh differ here
121 #declare -rxn x=z
122 #echo ${x@a}
123 ## STDOUT:
124 a
125 ar
126 rx
127 ## END
128
129 #### ${var@a} error conditions
130 echo [${?@a}]
131 ## STDOUT:
132 []
133 ## END
134
135 #### undef and @P @Q @a
136 $SH -c 'echo ${undef@P}'
137 echo status=$?
138 $SH -c 'echo ${undef@Q}'
139 echo status=$?
140 $SH -c 'echo ${undef@a}'
141 echo status=$?
142 ## STDOUT:
143
144 status=0
145
146 status=0
147
148 status=0
149 ## END
150 ## OK osh STDOUT:
151
152 status=0
153 ''
154 status=0
155
156 status=0
157 ## END
158
159
160 #### argv array and @P @Q @a
161 $SH -c 'echo ${@@P}' dummy a b c
162 echo status=$?
163 $SH -c 'echo ${@@Q}' dummy a 'b\nc'
164 echo status=$?
165 $SH -c 'echo ${@@a}' dummy a b c
166 echo status=$?
167 ## STDOUT:
168 a b c
169 status=0
170 'a' 'b\nc'
171 status=0
172
173 status=0
174 ## END
175 ## OK osh STDOUT:
176 status=1
177 a $'b\\nc'
178 status=0
179 a
180 status=0
181 ## END
182
183 #### assoc array and @P @Q @a
184
185 # note: "y z" causes a bug!
186 $SH -c 'declare -A A=(["x"]="y"); echo ${A@P} - ${A[@]@P}'
187 echo status=$?
188
189 # note: "y z" causes a bug!
190 $SH -c 'declare -A A=(["x"]="y"); echo ${A@Q} - ${A[@]@Q}'
191 echo status=$?
192
193 $SH -c 'declare -A A=(["x"]=y); echo ${A@a} - ${A[@]@a}'
194 echo status=$?
195 ## STDOUT:
196 - y
197 status=0
198 - 'y'
199 status=0
200 A - A
201 status=0
202 ## END
203 ## OK osh STDOUT:
204 status=1
205 status=1
206 A - A
207 status=0
208 ## END
209
210 #### ${!var[@]@X}
211 # note: "y z" causes a bug!
212 $SH -c 'declare -A A=(["x"]="y"); echo ${!A[@]@P}'
213 if test $? -ne 0; then echo fail; fi
214
215 # note: "y z" causes a bug!
216 $SH -c 'declare -A A=(["x y"]="y"); echo ${!A[@]@Q}'
217 if test $? -ne 0; then echo fail; fi
218
219 $SH -c 'declare -A A=(["x"]=y); echo ${!A[@]@a}'
220 if test $? -ne 0; then echo fail; fi
221 # STDOUT:
222
223
224
225 # END
226 ## OK osh STDOUT:
227 fail
228 'x y'
229 a
230 ## END
231
232 #### ${#var@X} is a parse error
233 # note: "y z" causes a bug!
234 $SH -c 'declare -A A=(["x"]="y"); echo ${#A[@]@P}'
235 if test $? -ne 0; then echo fail; fi
236
237 # note: "y z" causes a bug!
238 $SH -c 'declare -A A=(["x"]="y"); echo ${#A[@]@Q}'
239 if test $? -ne 0; then echo fail; fi
240
241 $SH -c 'declare -A A=(["x"]=y); echo ${#A[@]@a}'
242 if test $? -ne 0; then echo fail; fi
243 ## STDOUT:
244 fail
245 fail
246 fail
247 ## END
248
249 #### ${!A@a} and ${!A[@]@a}
250 declare -A A=(["x"]=y)
251 echo x=${!A[@]@a}
252 echo x=${!A@a}
253
254 # OSH prints 'a' for indexed array because the AssocArray with ! turns into
255 # it. Disallowing it would be the other reasonable behavior.
256
257 ## STDOUT:
258 x=
259 x=
260 ## END