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 |
#### "${empty:-}" |
17 |
empty= |
18 |
argv.py "${empty:-}" |
19 |
## stdout: [''] |
20 |
|
21 |
#### ${empty:-} |
22 |
empty= |
23 |
argv.py ${empty:-} |
24 |
## stdout: [] |
25 |
|
26 |
#### array with empty values |
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 |
#### substitution of IFS character, quoted and unquoted |
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 |
#### Inner single quotes |
57 |
argv.py ${Unset:-'b'} |
58 |
## stdout: ['b'] |
59 |
|
60 |
#### Inner single quotes, outer double quotes |
61 |
# This is the WEIRD ONE. Single quotes appear outside. But all shells agree! |
62 |
argv.py "${Unset:-'b'}" |
63 |
## stdout: ["'b'"] |
64 |
|
65 |
#### Inner double quotes |
66 |
argv.py ${Unset:-"b"} |
67 |
## stdout: ['b'] |
68 |
|
69 |
#### Inner double quotes, outer double quotes |
70 |
argv.py "${Unset-"b"}" |
71 |
## stdout: ['b'] |
72 |
|
73 |
#### Multiple words: no quotes |
74 |
argv.py ${Unset:-a b c} |
75 |
## stdout: ['a', 'b', 'c'] |
76 |
|
77 |
#### Multiple words: no outer quotes, inner single quotes |
78 |
argv.py ${Unset:-'a b c'} |
79 |
## stdout: ['a b c'] |
80 |
|
81 |
#### Multiple words: no outer quotes, inner double quotes |
82 |
argv.py ${Unset:-"a b c"} |
83 |
## stdout: ['a b c'] |
84 |
|
85 |
#### Multiple words: outer double quotes, no inner quotes |
86 |
argv.py "${Unset:-a b c}" |
87 |
## stdout: ['a b c'] |
88 |
|
89 |
#### Multiple words: outer double quotes, inner double quotes |
90 |
argv.py "${Unset:-"a b c"}" |
91 |
## stdout: ['a b c'] |
92 |
|
93 |
#### Multiple words: outer double quotes, inner single quotes |
94 |
argv.py "${Unset:-'a b c'}" |
95 |
# WEIRD ONE. |
96 |
## stdout: ["'a b c'"] |
97 |
|
98 |
#### Mixed inner quotes |
99 |
argv.py ${Unset:-"a b" c} |
100 |
## stdout: ['a b', 'c'] |
101 |
|
102 |
#### Mixed inner quotes with outer quotes |
103 |
argv.py "${Unset:-"a b" c}" |
104 |
## stdout: ['a b c'] |
105 |
|
106 |
#### part_value tree with multiple words |
107 |
argv.py ${a:-${a:-"1 2" "3 4"}5 "6 7"} |
108 |
## stdout: ['1 2', '3 45', '6 7'] |
109 |
|
110 |
#### part_value tree on RHS |
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 |
#### Var with multiple words: no quotes |
116 |
var='a b c' |
117 |
argv.py ${Unset:-$var} |
118 |
## stdout: ['a', 'b', 'c'] |
119 |
|
120 |
#### Multiple words: no outer quotes, inner single quotes |
121 |
var='a b c' |
122 |
argv.py ${Unset:-'$var'} |
123 |
## stdout: ['$var'] |
124 |
|
125 |
#### Multiple words: no outer quotes, inner double quotes |
126 |
var='a b c' |
127 |
argv.py ${Unset:-"$var"} |
128 |
## stdout: ['a b c'] |
129 |
|
130 |
#### Multiple words: outer double quotes, no inner quotes |
131 |
var='a b c' |
132 |
argv.py "${Unset:-$var}" |
133 |
## stdout: ['a b c'] |
134 |
|
135 |
#### Multiple words: outer double quotes, inner double quotes |
136 |
var='a b c' |
137 |
argv.py "${Unset:-"$var"}" |
138 |
## stdout: ['a b c'] |
139 |
|
140 |
#### Multiple words: outer double quotes, inner single quotes |
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 |
#### No outer quotes, Multiple internal quotes |
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 |
#### Strip a string with single quotes, unquoted |
156 |
foo="'a b c d'" |
157 |
argv.py ${foo%d\'} |
158 |
## stdout: ["'a", 'b', 'c'] |
159 |
|
160 |
#### Strip a string with single quotes, double quoted |
161 |
foo="'a b c d'" |
162 |
argv.py "${foo%d\'}" |
163 |
## STDOUT: |
164 |
["'a b c "] |
165 |
## END |
166 |
|
167 |
#### The string to strip is space sensitive |
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 |
#### The string to strip can be single quoted, outer is unquoted |
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 |
#### Syntax error for single quote in double quote |
178 |
foo="'a b c d'" |
179 |
argv.py "${foo%d'}" |
180 |
## stdout-json: "" |
181 |
## status: 2 |
182 |
## OK mksh status: 1 |
183 |
|
184 |
#### "${undef-'c d'}" and "${foo%'c d'}" are parsed differently |
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 |
#### $'' allowed within VarSub arguments |
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 |
#### # operator with single quoted arg (dash/ash and bash/mksh disagree, reported by Crestwave) |
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 |
#### / operator with single quoted arg (causes syntax error in regex in OSH, reported by Crestwave) |
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 |
#### single quotes work inside character classes |
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 |
#### comparison: :- operator with single quoted arg |
280 |
echo ${unset:-'a'} |
281 |
echo "${unset:-'a'}" |
282 |
## STDOUT: |
283 |
a |
284 |
'a' |
285 |
## END |
286 |
|
287 |
|
288 |
#### Right Brace as argument (similar to #702) |
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 |
|