1 |
#
|
2 |
# Tests for the args in:
|
3 |
#
|
4 |
# ${foo:-}
|
5 |
#
|
6 |
# I think the weird single quote behavior is a bug, but everyone agrees. It's
|
7 |
# a consequence of quote removal.
|
8 |
#
|
9 |
# WEIRD: single quoted default, inside double quotes. Oh I guess this is
|
10 |
# because double quotes don't treat single quotes as special?
|
11 |
#
|
12 |
# OK here is the issue. If we have ${} bare, then the default is parsed as
|
13 |
# LexState.OUTER. If we have "${}", then it's parsed as LexState.DQ. That
|
14 |
# makes sense I guess. Vim's syntax highlighting is throwing me off.
|
15 |
|
16 |
|
17 |
empty=
|
18 |
argv.py "${empty:-}"
|
19 |
## stdout: ['']
|
20 |
|
21 |
|
22 |
empty=
|
23 |
argv.py ${empty:-}
|
24 |
## stdout: []
|
25 |
|
26 |
|
27 |
declare -a A=('' x "" '')
|
28 |
argv.py "${A[@]}"
|
29 |
## stdout: ['', 'x', '', '']
|
30 |
## N-I dash stdout-json: ""
|
31 |
## N-I dash status: 2
|
32 |
## N-I mksh stdout-json: ""
|
33 |
## N-I mksh status: 1
|
34 |
|
35 |
|
36 |
IFS=:
|
37 |
s=:
|
38 |
argv.py $s
|
39 |
argv.py "$s"
|
40 |
## STDOUT:
|
41 |
['']
|
42 |
[':']
|
43 |
## END
|
44 |
|
45 |
|
46 |
empty=''
|
47 |
argv.py ${empty:-a} ${Unset:-b}
|
48 |
## stdout: ['a', 'b']
|
49 |
|
50 |
|
51 |
empty=''
|
52 |
argv.py ${empty-a} ${Unset-b}
|
53 |
# empty one is still elided!
|
54 |
## stdout: ['b']
|
55 |
|
56 |
|
57 |
argv.py ${Unset:-'b'}
|
58 |
## stdout: ['b']
|
59 |
|
60 |
|
61 |
# This is the WEIRD ONE. Single quotes appear outside. But all shells agree!
|
62 |
argv.py "${Unset:-'b'}"
|
63 |
## stdout: ["'b'"]
|
64 |
|
65 |
|
66 |
argv.py ${Unset:-"b"}
|
67 |
## stdout: ['b']
|
68 |
|
69 |
|
70 |
argv.py "${Unset-"b"}"
|
71 |
## stdout: ['b']
|
72 |
|
73 |
|
74 |
argv.py ${Unset:-a b c}
|
75 |
## stdout: ['a', 'b', 'c']
|
76 |
|
77 |
|
78 |
argv.py ${Unset:-'a b c'}
|
79 |
## stdout: ['a b c']
|
80 |
|
81 |
|
82 |
argv.py ${Unset:-"a b c"}
|
83 |
## stdout: ['a b c']
|
84 |
|
85 |
|
86 |
argv.py "${Unset:-a b c}"
|
87 |
## stdout: ['a b c']
|
88 |
|
89 |
|
90 |
argv.py "${Unset:-"a b c"}"
|
91 |
## stdout: ['a b c']
|
92 |
|
93 |
|
94 |
argv.py "${Unset:-'a b c'}"
|
95 |
# WEIRD ONE.
|
96 |
## stdout: ["'a b c'"]
|
97 |
|
98 |
|
99 |
argv.py ${Unset:-"a b" c}
|
100 |
## stdout: ['a b', 'c']
|
101 |
|
102 |
|
103 |
argv.py "${Unset:-"a b" c}"
|
104 |
## stdout: ['a b c']
|
105 |
|
106 |
|
107 |
argv.py ${a:-${a:-"1 2" "3 4"}5 "6 7"}
|
108 |
## stdout: ['1 2', '3 45', '6 7']
|
109 |
|
110 |
|
111 |
v=${a:-${a:-"1 2" "3 4"}5 "6 7"}
|
112 |
argv.py "${v}"
|
113 |
## stdout: ['1 2 3 45 6 7']
|
114 |
|
115 |
|
116 |
var='a b c'
|
117 |
argv.py ${Unset:-$var}
|
118 |
## stdout: ['a', 'b', 'c']
|
119 |
|
120 |
|
121 |
var='a b c'
|
122 |
argv.py ${Unset:-'$var'}
|
123 |
## stdout: ['$var']
|
124 |
|
125 |
|
126 |
var='a b c'
|
127 |
argv.py ${Unset:-"$var"}
|
128 |
## stdout: ['a b c']
|
129 |
|
130 |
|
131 |
var='a b c'
|
132 |
argv.py "${Unset:-$var}"
|
133 |
## stdout: ['a b c']
|
134 |
|
135 |
|
136 |
var='a b c'
|
137 |
argv.py "${Unset:-"$var"}"
|
138 |
## stdout: ['a b c']
|
139 |
|
140 |
|
141 |
# WEIRD ONE.
|
142 |
#
|
143 |
# I think I should just disallow any word with single quotes inside double
|
144 |
# quotes.
|
145 |
var='a b c'
|
146 |
argv.py "${Unset:-'$var'}"
|
147 |
## stdout: ["'a b c'"]
|
148 |
|
149 |
|
150 |
# It's like a single command word. Parts are joined directly.
|
151 |
var='a b c'
|
152 |
argv.py ${Unset:-A$var " $var"D E F}
|
153 |
## stdout: ['Aa', 'b', 'c', ' a b cD', 'E', 'F']
|
154 |
|
155 |
|
156 |
foo="'a b c d'"
|
157 |
argv.py ${foo%d\'}
|
158 |
## stdout: ["'a", 'b', 'c']
|
159 |
|
160 |
|
161 |
foo="'a b c d'"
|
162 |
argv.py "${foo%d\'}"
|
163 |
## STDOUT:
|
164 |
["'a b c "]
|
165 |
## END
|
166 |
|
167 |
|
168 |
foo='a b c d'
|
169 |
argv.py "${foo%c d}" "${foo%c d}"
|
170 |
## stdout: ['a b ', 'a b c d']
|
171 |
|
172 |
|
173 |
foo='a b c d'
|
174 |
argv.py ${foo%'c d'} ${foo%'c d'}
|
175 |
## stdout: ['a', 'b', 'a', 'b', 'c', 'd']
|
176 |
|
177 |
|
178 |
foo="'a b c d'"
|
179 |
argv.py "${foo%d'}"
|
180 |
## stdout-json: ""
|
181 |
## status: 2
|
182 |
## OK mksh status: 1
|
183 |
|
184 |
|
185 |
|
186 |
# quotes are LITERAL here
|
187 |
argv.py "${undef-'c d'}" "${undef-'c d'}"
|
188 |
argv.py ${undef-'c d'} ${undef-'c d'}
|
189 |
|
190 |
echo ---
|
191 |
|
192 |
# quotes are RESPECTED here
|
193 |
foo='a b c d'
|
194 |
argv.py "${foo%'c d'}" "${foo%'c d'}"
|
195 |
|
196 |
case $SH in (dash) exit ;; esac
|
197 |
|
198 |
argv.py "${foo//'c d'/zzz}" "${foo//'c d'/zzz}"
|
199 |
argv.py "${foo//'c d'/'zzz'}" "${foo//'c d'/'zzz'}"
|
200 |
|
201 |
## STDOUT:
|
202 |
["'c d'", "'c d'"]
|
203 |
['c d', 'c d']
|
204 |
---
|
205 |
['a b ', 'a b c d']
|
206 |
['a b zzz', 'a b c d']
|
207 |
['a b zzz', 'a b c d']
|
208 |
## END
|
209 |
## OK dash STDOUT:
|
210 |
["'c d'", "'c d'"]
|
211 |
['c d', 'c d']
|
212 |
---
|
213 |
['a b ', 'a b c d']
|
214 |
## END
|
215 |
|
216 |
|
217 |
# Odd behavior of bash/mksh: $'' is recognized but NOT ''!
|
218 |
x=abc
|
219 |
echo ${x%$'b'*}
|
220 |
echo "${x%$'b'*}" # git-prompt.sh relies on this
|
221 |
## STDOUT:
|
222 |
a
|
223 |
a
|
224 |
## END
|
225 |
## N-I dash STDOUT:
|
226 |
abc
|
227 |
abc
|
228 |
## END
|
229 |
|
230 |
|
231 |
var=a
|
232 |
echo -${var#'a'}-
|
233 |
echo -"${var#'a'}"-
|
234 |
var="'a'"
|
235 |
echo -${var#'a'}-
|
236 |
echo -"${var#'a'}"-
|
237 |
## STDOUT:
|
238 |
--
|
239 |
--
|
240 |
-'a'-
|
241 |
-'a'-
|
242 |
## END
|
243 |
## OK ash STDOUT:
|
244 |
--
|
245 |
-a-
|
246 |
-'a'-
|
247 |
--
|
248 |
## END
|
249 |
|
250 |
|
251 |
var="++--''++--''"
|
252 |
echo no plus or minus "${var//[+-]}"
|
253 |
echo no plus or minus "${var//['+-']}"
|
254 |
## STDOUT:
|
255 |
no plus or minus ''''
|
256 |
no plus or minus ''''
|
257 |
## END
|
258 |
## status: 0
|
259 |
## BUG ash STDOUT:
|
260 |
no plus or minus ''''
|
261 |
no plus or minus ++--++--
|
262 |
## END
|
263 |
## BUG ash status: 0
|
264 |
## N-I dash stdout-json: ""
|
265 |
## N-I dash status: 2
|
266 |
|
267 |
|
268 |
x='a[[[---]]]b'
|
269 |
echo "${x//['[]']}"
|
270 |
## STDOUT:
|
271 |
a---b
|
272 |
## END
|
273 |
## BUG ash STDOUT:
|
274 |
a[[[---]]]b
|
275 |
## END
|
276 |
## N-I dash stdout-json: ""
|
277 |
## N-I dash status: 2
|
278 |
|
279 |
|
280 |
echo ${unset:-'a'}
|
281 |
echo "${unset:-'a'}"
|
282 |
## STDOUT:
|
283 |
a
|
284 |
'a'
|
285 |
## END
|
286 |
|
287 |
|
288 |
|
289 |
|
290 |
echo "${var-}}"
|
291 |
echo "${var-\}}"
|
292 |
echo "${var-'}'}"
|
293 |
echo "${var-"}"}"
|
294 |
## STDOUT:
|
295 |
}
|
296 |
}
|
297 |
''}
|
298 |
}
|
299 |
## END
|
300 |
## BUG bash STDOUT:
|
301 |
}
|
302 |
}
|
303 |
'}'
|
304 |
}
|
305 |
## END
|
306 |
## BUG yash STDOUT:
|
307 |
}
|
308 |
}
|
309 |
}
|
310 |
}
|
311 |
## END
|
312 |
|