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 |
|