xref: /titanic_50/usr/src/lib/libshell/common/tests/substring.sh (revision 3fbbb872ea33adea240e8fd8c692f6d3131cc69b)
1########################################################################
2#                                                                      #
3#               This software is part of the ast package               #
4#           Copyright (c) 1982-2007 AT&T Knowledge Ventures            #
5#                      and is licensed under the                       #
6#                  Common Public License, Version 1.0                  #
7#                      by AT&T Knowledge Ventures                      #
8#                                                                      #
9#                A copy of the License is available at                 #
10#            http://www.opensource.org/licenses/cpl1.0.txt             #
11#         (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9)         #
12#                                                                      #
13#              Information and Software Systems Research               #
14#                            AT&T Research                             #
15#                           Florham Park NJ                            #
16#                                                                      #
17#                  David Korn <dgk@research.att.com>                   #
18#                                                                      #
19########################################################################
20function err_exit
21{
22	print -u2 -n "\t"
23	print -u2 -r ${Command}[$1]: "${@:2}"
24	let Errors+=1
25}
26alias err_exit='err_exit $LINENO'
27
28Command=${0##*/}
29integer Errors=0 j=4
30base=/home/dgk/foo//bar
31string1=$base/abcabcabc
32if	[[ ${string1:0} != "$string1" ]]
33then	err_exit "string1:0"
34fi
35if	[[ ${string1: -1} != "c" ]]
36then	err_exit "string1: -1"
37fi
38if	[[ ${string1:0:1000} != "$string1" ]]
39then	err_exit "string1:0"
40fi
41if	[[ ${string1:1} != "${string1#?}" ]]
42then	err_exit "string1:1"
43fi
44if	[[ ${string1:1:4} != home ]]
45then	err_exit "string1:1:4"
46fi
47if	[[ ${string1: -5:4} != bcab ]]
48then	err_exit "string1: -5:4"
49fi
50if	[[ ${string1:1:j} != home ]]
51then	err_exit "string1:1:j"
52fi
53if	[[ ${string1:(j?1:0):j} != home ]]
54then	err_exit "string1:(j?1:0):j"
55fi
56if	[[ ${string1%*zzz*} != "$string1" ]]
57then	err_exit "string1%*zzz*"
58fi
59if	[[ ${string1%%*zzz*} != "$string1" ]]
60then	err_exit "string1%%*zzz*"
61fi
62if	[[ ${string1#*zzz*} != "$string1" ]]
63then	err_exit "string1#*zzz*"
64fi
65if	[[ ${string1##*zzz*} != "$string1" ]]
66then	err_exit "string1##*zzz*"
67fi
68if	[[ ${string1%+(abc)} != "$base/abcabc" ]]
69then	err_exit "string1%+(abc)"
70fi
71if	[[ ${string1%%+(abc)} != "$base/" ]]
72then	err_exit "string1%%+(abc)"
73fi
74if	[[ ${string1%/*} != "$base" ]]
75then	err_exit "string1%/*"
76fi
77if	[[ "${string1%/*}" != "$base" ]]
78then	err_exit '"string1%/*"'
79fi
80if	[[ ${string1%"/*"} != "$string1" ]]
81then	err_exit 'string1%"/*"'
82fi
83if	[[ ${string1%%/*} != "" ]]
84then	err_exit "string1%%/*"
85fi
86if	[[ ${string1#*/bar} != /abcabcabc ]]
87then	err_exit "string1#*bar"
88fi
89if	[[ ${string1##*/bar} != /abcabcabc ]]
90then	err_exit "string1#*bar"
91fi
92if	[[ "${string1#@(*/bar|*/foo)}" != //bar/abcabcabc ]]
93then	err_exit "string1#@(*/bar|*/foo)"
94fi
95if	[[ ${string1##@(*/bar|*/foo)} != /abcabcabc ]]
96then	err_exit "string1##@(*/bar|*/foo)"
97fi
98if	[[ ${string1##*/@(bar|foo)} != /abcabcabc ]]
99then	err_exit "string1##*/@(bar|foo)"
100fi
101foo=abc
102if	[[ ${foo#a[b*} != abc ]]
103then	err_exit "abc#a[b*} != abc"
104fi
105if	[[ ${foo//[0-9]/bar} != abc ]]
106then	err_exit '${foo//[0-9]/bar} not expanding correctly'
107fi
108foo='(abc)'
109if	[[ ${foo#'('} != 'abc)' ]]
110then	err_exit "(abc)#( != abc)"
111fi
112if	[[ ${foo%')'} != '(abc' ]]
113then	err_exit "(abc)%) != (abc"
114fi
115foo=a123b456c
116if	[[ ${foo/[0-9]?/""} != a3b456c ]]
117then	err_exit '${foo/[0-9]?/""} not expanding correctly'
118fi
119if	[[ ${foo//[0-9]/""} != abc ]]
120then	err_exit '${foo//[0-9]/""} not expanding correctly'
121fi
122if	[[ ${foo/#a/b} != b123b456c ]]
123then	err_exit '${foo/#a/b} not expanding correctly'
124fi
125if	[[ ${foo/#?/b} != b123b456c ]]
126then	err_exit '${foo/#?/b} not expanding correctly'
127fi
128if	[[ ${foo/%c/b} != a123b456b ]]
129then	err_exit '${foo/%c/b} not expanding correctly'
130fi
131if	[[ ${foo/%?/b} != a123b456b ]]
132then	err_exit '${foo/%?/b} not expanding correctly'
133fi
134while read -r pattern string expected
135do	if	(( expected ))
136	then	if	[[ $string != $pattern ]]
137		then	err_exit "$pattern does not match $string"
138		fi
139		if	[[ ${string##$pattern} != "" ]]
140		then	err_exit "\${$string##$pattern} not null"
141		fi
142		if	[ "${string##$pattern}" != '' ]
143		then	err_exit "\"\${$string##$pattern}\" not null"
144		fi
145		if	[[ ${string/$pattern} != "" ]]
146		then	err_exit "\${$string/$pattern} not null"
147		fi
148	else	if	[[ $string == $pattern ]]
149		then	err_exit "$pattern matches $string"
150		fi
151	fi
152done <<- \EOF
153	+(a)*+(a)	aabca	1
154	!(*.o)		foo.o	0
155	!(*.o)		foo.c	1
156EOF
157xx=a/b/c/d/e
158yy=${xx#*/}
159if	[[ $yy != b/c/d/e ]]
160then	err_exit '${xx#*/} != a/b/c/d/e when xx=a/b/c/d/e'
161fi
162if	[[ ${xx//\//\\} != 'a\b\c\d\e' ]]
163then	err_exit '${xx//\//\\} not working'
164fi
165x=[123]def
166if	[[ "${x//\[(*)\]/\{\1\}}" != {123}def ]]
167then	err_exit 'closing brace escape not working'
168fi
169unset foo
170foo=one/two/three
171if	[[ ${foo//'/'/_} != one_two_three ]]
172then	err_exit 'single quoting / in replacements failed'
173fi
174if	[[ ${foo//"/"/_} != one_two_three ]]
175then	err_exit 'double quoting / in replacements failed'
176fi
177if	[[ ${foo//\//_} != one_two_three ]]
178then	err_exit 'escaping / in replacements failed'
179fi
180function myexport
181{
182	nameref var=$1
183	if	(( $# > 1 ))
184	then	export	$1=$2
185	fi
186	if	(( $# > 2 ))
187	then	print $(myexport "$1" "$3" )
188		return
189	fi
190	typeset val
191	val=$(export | grep "^$1=")
192	print ${val#"$1="}
193
194}
195export dgk=base
196if	[[ $(myexport dgk fun) != fun ]]
197then	err_exit 'export inside function not working'
198fi
199val=$(export | grep "^dgk=")
200if	[[ ${val#dgk=} != base ]]
201then	err_exit 'export not restored after function call'
202fi
203if	[[ $(myexport dgk fun fun2) != fun2 ]]
204then	err_exit 'export inside function not working with recursive function'
205fi
206val=$(export | grep "^dgk=")
207if	[[ ${val#dgk=} != base ]]
208then	err_exit 'export not restored after recursive function call'
209fi
210if	[[ $(dgk=try3 myexport dgk) != try3 ]]
211then	err_exit 'name=value not added to export list with function call'
212fi
213val=$(export | grep "^dgk=")
214if	[[ ${val#dgk=} != base ]]
215then	err_exit 'export not restored name=value function call'
216fi
217unset zzz
218if	[[ $(myexport zzz fun) != fun ]]
219then	err_exit 'export inside function not working for zzz'
220fi
221if	[[ $(export | grep "zzz=") ]]
222then	err_exit 'zzz exported after function call'
223fi
224set -- foo/bar bam/yes last/file/done
225if	[[ ${@/*\/@(*)/${.sh.match[1]}} != 'bar yes done' ]]
226then	err_exit '.sh.match not working with $@'
227fi
228if	[[ ${@/*\/@(*)/\1} != 'bar yes done' ]]
229then	err_exit '\1 not working with $@'
230fi
231var=(foo/bar bam/yes last/file/done)
232if	[[ ${var[@]/*\/@(*)/${.sh.match[1]}} != 'bar yes done' ]]
233then	err_exit '.sh.match not working with ${var[@]}'
234fi
235if	[[ ${var[@]/*\/@(*)/\1} != 'bar yes done' ]]
236then	err_exit '\1 not working with ${var[@]}'
237fi
238var='abc_d2ef.462abc %%'
239if	[[ ${var/+(\w)/Q} != 'Q.462abc %%' ]]
240then	err_exit '${var/+(\w)/Q} not workding'
241fi
242if	[[ ${var//+(\w)/Q} != 'Q.Q %%' ]]
243then	err_exit '${var//+(\w)/Q} not workding'
244fi
245if	[[ ${var//+(\S)/Q} != 'Q Q' ]]
246then	err_exit '${var//+(\S)/Q} not workding'
247fi
248if	[[ "$(LC_ALL=debug $SHELL <<- \+EOF+
249		x=a<2bc><3xyz>g
250		print ${#x}
251		+EOF+)" != 4
252	]]
253then	err_exit '${#x} not working with multibyte locales'
254fi
255foo='foo+bar+'
256[[ $(print -r -- ${foo//+/'|'}) != 'foo|bar|' ]] && err_exit "\${foobar//+/'|'}"
257[[ $(print -r -- ${foo//+/"|"}) != 'foo|bar|' ]] && err_exit '${foobar//+/"|"}'
258[[ $(print -r -- "${foo//+/'|'}") != 'foo|bar|' ]] && err_exit '"${foobar//+/'"'|'"'}"'
259[[ $(print -r -- "${foo//+/"|"}") != 'foo|bar|' ]] && err_exit '"${foobar//+/"|"}"'
260unset x
261x=abcedfg
262: ${x%@(d)f@(g)}
263[[ ${.sh.match[0]} == dfg ]] || err_exit '.sh.match[0] not dfg'
264[[ ${.sh.match[1]} == d ]] || err_exit '.sh.match[1] not d'
265[[ ${.sh.match[2]} == g ]] || err_exit '.sh.match[2] not g'
266x=abcedddfg
267: ${x%%+(d)f@(g)}
268[[ ${.sh.match[1]} == ddd ]] || err_exit '.sh.match[1] not ddd'
269unset a b
270a='\[abc @(*) def\]'
271b='[abc 123 def]'
272[[ ${b//$a/\1} == 123 ]] || err_exit "\${var/pattern} not working with \[ in pattern"
273unset X
274$SHELL -c '[[ ! ${X[@]:0:300} ]]' 2> /dev/null || err_exit '${X[@]:0:300} with X undefined fails'
275$SHELL -c '[[ ${@:0:300} == "$0" ]]' 2> /dev/null || err_exit '${@:0:300} with no arguments fails'
276i=20030704
277[[ ${i#{6}(?)} == 04 ]] ||  err_exit '${i#{6}(?)} not working'
278[[ ${i#{6,6}(?)} == 04 ]] ||  err_exit '${i#{6,6}(?)} not working'
279LC_ALL=posix
280i="   ."
281[[ $(printf "<%s>\n" ${i#' '}) == '<.>' ]] || err_exit 'printf "<%s>\n" ${i#' '} failed'
282unset x
283x=foo
284[[ "${x%o}(1)" == "fo(1)" ]] ||  err_exit 'print ${}() treated as pattern'
285unset i pattern string
286string=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghigklmnopqrstuvwxyz
287integer i
288for((i=0; i < ${#string}; i++))
289do	pattern+='@(?)'
290done
291[[ $(string=$string $SHELL -c  ": \${string/$pattern/}; print \${.sh.match[26]}") == Z ]] || err_exit -u2 'sh.match[26] not Z'
292: ${string/$pattern/}
293(( ${#.sh.match[@]} == 53 )) || err_exit '.sh.match has wrong number of elements'
294[[ ${.sh.match[@]:2:4} == 'B C D E'  ]] || err_exit '${.sh.match[@]:2:4} incorrect'
295
296D=$';' E=$'\\\\' Q=$'"' S=$'\'' M='nested pattern substitution failed'
297
298x='-(-)-'
299[[ ${x/*%(())*/\1} == '(-)' ]] || err_exit $M
300x='-(-)-)-'
301[[ ${x/*%(())*/\1} == '(-)' ]] || err_exit $M
302x='-(-()-)-'
303[[ ${x/*%(())*/\1} == '()' ]] || err_exit $M
304x='-(-\)-)-'
305[[ ${x/*%(())*/\1} == '(-\)' ]] || err_exit $M
306x='-(-\\)-)-'
307[[ ${x/*%(())*/\1} == '(-\\)' ]] || err_exit $M
308x='-(-(-)-'
309[[ ${x/*%(())*/\1} == '(-)' ]] || err_exit $M
310x='-(-(-)-)-'
311[[ ${x/*%(())*/\1} == '(-)' ]] || err_exit $M
312x='-(-[-]-)-'
313[[ ${x/*%(()[])*/\1} == '(-[-]-)' ]] || err_exit $M
314x='-[-(-)-]-'
315[[ ${x/*%(()[])*/\1} == '(-)' ]] || err_exit $M
316x='-(-[-)-]-'
317[[ ${x/*%(()[])*/\1} == '-(-[-)-]-' ]] || err_exit $M
318x='-(-[-]-)-'
319[[ ${x/*%([]())*/\1} == '[-]' ]] || err_exit $M
320x='-[-(-)-]-'
321[[ ${x/*%([]())*/\1} == '[-(-)-]' ]] || err_exit $M
322x='-(-[-)-]-'
323[[ ${x/*%([]())*/\1} == '-(-[-)-]-' ]] || err_exit $M
324
325x='-((-))-'
326[[ ${x/*%(())*/\1} == '(-)' ]] || err_exit $M
327x='-((-))-'
328[[ ${x/~(-g)*%(())*/\1} == '((-))-' ]] || err_exit $M
329x='-((-))-'
330[[ ${x/~(-g:*)*%(())*/\1} == '(-)' ]] || err_exit $M
331x='-((-))-'
332[[ ${x/~(+g)*%(())*/\1} == '(-)' ]] || err_exit $M
333x='-((-))-'
334[[ ${x/~(+g:*)*%(())*/\1} == '(-)' ]] || err_exit $M
335x='-((-))-'
336[[ ${x/*(?)*%(())*(?)*/:\1:\2:\3:} == ':-(:(-):)-:' ]] || err_exit $M
337x='-((-))-'
338[[ ${x/~(-g)*(?)*%(())*(?)*/:\1:\2:\3:} == '::((-))::-' ]] || err_exit $M
339x='-((-))-'
340[[ ${x/~(-g:*(?))*%(())*(?)*/:\1:\2:\3:} == '::(-):)-:' ]] || err_exit $M
341x='-((-))-'
342[[ ${x/~(+g)*(?)*%(())*(?)*/:\1:\2:\3:} == ':-(:(-):)-:' ]] || err_exit $M
343x='-((-))-'
344[[ ${x/~(+g:*(?))*%(())*(?)*/:\1:\2:\3:} == ':-(:(-):)-:' ]] || err_exit $M
345x='call(a+b,x/(c/d),(0));'
346[[ ${x/+([[:alnum:]])*([[:space:]])(*%(()))*/:\1:\2:\3:} == ':call::(a+b,x/(c/d),(0)):' ]] || err_exit $M
347
348x='-(-;-)-'
349[[ ${x/*%(()D${D})*/\1} == '-(-;-)-' ]] || err_exit $M
350x='-(-);-'
351[[ ${x/*%(()D${D})*/\1} == '(-)' ]] || err_exit $M
352x='-(-)\;-'
353[[ ${x/*%(()D${D})*/\1} == '(-)' ]] || err_exit $M
354x='-(-\;-)-'
355[[ ${x/*%(()D${D}E${E})*/\1} == '(-\;-)' ]] || err_exit $M
356x='-(-)\;-'
357[[ ${x/*%(()D${D}E${E})*/\1} == '(-)' ]] || err_exit $M
358x='-(-(-)\;-)-'
359[[ ${x/*%(()D${D}E${E})*/\1} == '(-)' ]] || err_exit $M
360
361x='-(-")"-)-'
362[[ ${x/*%(()Q${Q})*/\1} == '(-")"-)' ]] || err_exit $M
363x='-(-\")"-)-'
364[[ ${x/*%(()Q${Q})*/\1} == '(-\")"-)' ]] || err_exit $M
365x='-(-\")\"-)-'
366[[ ${x/*%(()Q${Q})*/\1} == '(-\")\"-)' ]] || err_exit $M
367x=$'-(-\\\'")\\\'-)-'
368[[ ${x/*%(()Q${S}Q${Q})*/\1} == $'(-\\\'")\\\'-)' ]] || err_exit $M
369x=$'-(-\\\'")"-)-'
370[[ ${x/*%(()Q${S}Q${Q})*/\1} == $'-(-\\\'")"-)-' ]] || err_exit $M
371x=$'-(-\\\'")"\'-)-'
372[[ ${x/*%(()Q${S}Q${Q})*/\1} == $'(-\\\'")"\'-)' ]] || err_exit $M
373x=$'-(-\\"\')\'\\"-)-'
374[[ ${x/*%(()Q${S}Q${Q})*/\1} == $'(-\\"\')\'\\"-)' ]] || err_exit $M
375x=$'-(-\')\\\'\'-)-'
376[[ ${x/*%(()Q${S}Q${Q})*/\1} == $'-(-\')\\\'\'-)-' ]] || err_exit $M
377x=$'-(-\'")\'-)-'
378[[ ${x/*%(()L${S}Q${Q})*/\1} == $'(-\'")\'-)' ]] || err_exit $M
379x=$'-(-\\\'")"-)-'
380[[ ${x/*%(()L${S}Q${Q})*/\1} == $'-(-\\\'")"-)-' ]] || err_exit $M
381x=$'-(-\\\'")"\'-)-'
382[[ ${x/*%(()L${S}Q${Q})*/\1} == $'(-\\\'")"\'-)' ]] || err_exit $M
383x=$'-(-\\"\')\'\\"-)-'
384[[ ${x/*%(()L${S}Q${Q})*/\1} == $'(-\\"\')\'\\"-)' ]] || err_exit $M
385x=$'-(-\')\\\'\'-)-'
386[[ ${x/*%(()L${S}Q${Q})*/\1} == $'-(-\')\\\'\'-)-' ]] || err_exit $M
387x='-(-")"-)-'
388[[ ${x/*%(()Q${Q})*/\1} == '(-")"-)' ]] || err_exit $M
389x='-(-\")"-)-'
390[[ ${x/*%(()Q${Q})*/\1} == '(-\")"-)' ]] || err_exit $M
391x='-(-\")\"-)-'
392[[ ${x/*%(()Q${Q})*/\1} == '(-\")\"-)' ]] || err_exit $M
393
394x='-(-\)-)-'
395[[ ${x/*%(()E${E})*/\1} == '(-\)-)' ]] || err_exit $M
396x='-(-\\)-)-'
397[[ ${x/*%(()E${E})*/\1} == '(-\\)' ]] || err_exit $M
398x='-(-\")"-)-'
399[[ ${x/*%(()E${E}Q${Q})*/\1} == '(-\")' ]] || err_exit $M
400x='-(-\")\"-)-'
401[[ ${x/*%(()E${E}Q${Q})*/\1} == '(-\")' ]] || err_exit $M
402x=$'-(-\'")"-)-'
403[[ ${x/*%(()E${E}Q${S}Q${Q})*/\1} == $'-(-\'")"-)-' ]] || err_exit $M
404x=$'-(-\\\'")"-)-'
405[[ ${x/*%(()E${E}Q${S}Q${Q})*/\1} == $'(-\\\'")"-)' ]] || err_exit $M
406x=$'-(-\\"\')\'\\"-)-'
407[[ ${x/*%(()E${E}Q${S}Q${Q})*/\1} == $'(-\\"\')\'\\"-)' ]] || err_exit $M
408x=$'-(-\\\'")"-)-'
409[[ ${x/*%(()E${E}L${S}Q${Q})*/\1} == $'(-\\\'")"-)' ]] || err_exit $M
410x=$'-(-\\"\')\'\\"-)-'
411[[ ${x/*%(()E${E}L${S}Q${Q})*/\1} == $'(-\\"\')\'\\"-)' ]] || err_exit $M
412x=$'-(-\\"\')\\\'\\"-)-'
413[[ ${x/*%(()E${E}L${S}Q${Q})*/\1} == $'(-\\"\')\\\'\\"-)' ]] || err_exit $M
414x=$'-(-\\"\')\\\'\\"\'-)-'
415[[ ${x/*%(()E${E}L${S}Q${Q})*/\1} == $'-(-\\"\')\\\'\\"\'-)-' ]] || err_exit $M
416
417x='-(-;-)-'
418[[ ${x/*%(()D\;)*/\1} == '-(-;-)-' ]] || err_exit $M
419x='-(-);-'
420[[ ${x/*%(()D\;)*/\1} == '(-)' ]] || err_exit $M
421x='-(-)\;-'
422[[ ${x/*%(()D\;)*/\1} == '(-)' ]] || err_exit $M
423x='-(-\;-)-'
424[[ ${x/*%(()D\;E\\)*/\1} == '(-\;-)' ]] || err_exit $M
425x='-(-);-'
426[[ ${x/*%(()D\;E\\)*/\1} == '(-)' ]] || err_exit $M
427x='-(-)\;-'
428[[ ${x/*%(()D\;E\\)*/\1} == '(-)' ]] || err_exit $M
429x='-(-(-)\;-)-'
430[[ ${x/*%(()D\;E\\)*/\1} == '(-)' ]] || err_exit $M
431
432x='-(-")"-)-'
433[[ ${x/*%(()Q\")*/\1} == '(-")"-)' ]] || err_exit $M
434x='-(-\")"-)-'
435[[ ${x/*%(()Q\")*/\1} == '(-\")"-)' ]] || err_exit $M
436x='-(-\")\"-)-'
437[[ ${x/*%(()Q\")*/\1} == '(-\")\"-)' ]] || err_exit $M
438x=$'-(-\\\'")\\\'-)-'
439[[ ${x/*%(()Q\'Q\")*/\1} == $'(-\\\'")\\\'-)' ]] || err_exit $M
440x=$'-(-\\\'")"-)-'
441[[ ${x/*%(()Q\'Q\")*/\1} == $'-(-\\\'")"-)-' ]] || err_exit $M
442x=$'-(-\\\'")"\'-)-'
443[[ ${x/*%(()Q\'Q\")*/\1} == $'(-\\\'")"\'-)' ]] || err_exit $M
444x=$'-(-\\"\')\'\\"-)-'
445[[ ${x/*%(()Q\'Q\")*/\1} == $'(-\\"\')\'\\"-)' ]] || err_exit $M
446x=$'-(-\')\\\'\'-)-'
447[[ ${x/*%(()Q\'Q\")*/\1} == $'-(-\')\\\'\'-)-' ]] || err_exit $M
448x=$'-(-\'")\'-)-'
449[[ ${x/*%(()L\'Q\")*/\1} == $'(-\'")\'-)' ]] || err_exit $M
450x=$'-(-\\\'")"-)-'
451[[ ${x/*%(()L\'Q\")*/\1} == $'-(-\\\'")"-)-' ]] || err_exit $M
452x=$'-(-\\\'")"\'-)-'
453[[ ${x/*%(()L\'Q\")*/\1} == $'(-\\\'")"\'-)' ]] || err_exit $M
454x=$'-(-\\"\')\'\\"-)-'
455[[ ${x/*%(()L\'Q\")*/\1} == $'(-\\"\')\'\\"-)' ]] || err_exit $M
456x=$'-(-\')\\\'\'-)-'
457[[ ${x/*%(()L\'Q\")*/\1} == $'-(-\')\\\'\'-)-' ]] || err_exit $M
458x='-(-")"-)-'
459[[ ${x/*%(()Q\")*/\1} == '(-")"-)' ]] || err_exit $M
460x='-(-\")"-)-'
461[[ ${x/*%(()Q\")*/\1} == '(-\")"-)' ]] || err_exit $M
462x='-(-\")\"-)-'
463[[ ${x/*%(()Q\")*/\1} == '(-\")\"-)' ]] || err_exit $M
464
465x='-(-\)-)-'
466[[ ${x/*%(()E\\)*/\1} == '(-\)-)' ]] || err_exit $M
467x='-(-\\)-)-'
468[[ ${x/*%(()E\\)*/\1} == '(-\\)' ]] || err_exit $M
469x='-(-\")"-)-'
470[[ ${x/*%(()E\\Q\")*/\1} == '(-\")' ]] || err_exit $M
471x='-(-\")\"-)-'
472[[ ${x/*%(()E\\Q\")*/\1} == '(-\")' ]] || err_exit $M
473x=$'-(-\'")"-)-'
474[[ ${x/*%(()E\\Q\'Q\")*/\1} == $'-(-\'")"-)-' ]] || err_exit $M
475x=$'-(-\\\'")"-)-'
476[[ ${x/*%(()E\\Q\'Q\")*/\1} == $'(-\\\'")"-)' ]] || err_exit $M
477x=$'-(-\\"\')\'\\"-)-'
478[[ ${x/*%(()E\\Q\'Q\")*/\1} == $'(-\\"\')\'\\"-)' ]] || err_exit $M
479x=$'-(-\\\'")"-)-'
480[[ ${x/*%(()E\\L\'Q\")*/\1} == $'(-\\\'")"-)' ]] || err_exit $M
481x=$'-(-\\"\')\'\\"-)-'
482[[ ${x/*%(()E\\L\'Q\")*/\1} == $'(-\\"\')\'\\"-)' ]] || err_exit $M
483x=$'-(-\\"\')\\\'\\"-)-'
484[[ ${x/*%(()E\\L\'Q\")*/\1} == $'(-\\"\')\\\'\\"-)' ]] || err_exit $M
485x=$'-(-\\"\')\\\'\\"\'-)-'
486[[ ${x/*%(()E\\L\'Q\")*/\1} == $'-(-\\"\')\\\'\\"\'-)-' ]] || err_exit $M
487
488pattern=00
489var=100
490[[ $( print $(( ${var%%00} )) ) == 1 ]] || err_exit "arithmetic with embeddded patterns fails"
491[[ $( print $(( ${var%%$pattern} )) ) == 1 ]] || err_exit "arithmetic with embeddded pattern variables fails"
492if	[[ ax == @(a)* ]] && [[ ${.sh.match[1]:0:${#.sh.match[1]}}  != a ]]
493then	err_exit '${.sh.match[1]:1:${#.sh.match[1]}} not expanding correctly'
494fi
495
496string='foo(d:\nt\box\something)bar'
497expected='d:\nt\box\something'
498[[ ${string/*\(+([!\)])\)*/\1} == "$expected" ]] || err_exit "substring expansion failed '${string/*\(+([!\)])\)*/\1}' returned -- '$expected' expected"
499if	[[ $($SHELL -c $'export LC_ALL=en_US.UTF-8; print -r "\342\202\254\342\202\254\342\202\254\342\202\254w\342\202\254\342\202\254\342\202\254\342\202\254" | wc -m' 2>/dev/null) == 10 ]]
500then	LC_ALL=en_US.UTF-8 $SHELL -c b1=$'"\342\202\254\342\202\254\342\202\254\342\202\254w\342\202\254\342\202\254\342\202\254\342\202\254"; [[ ${b1:4:1} == w ]]' || err_exit 'Multibyte ${var:offset:len} not working correctly'
501fi
502{ $SHELL -c 'unset x;[[ ${SHELL:$x} == $SHELL ]]';} 2> /dev/null || err_exit '${var:$x} fails when x is not set'
503{ $SHELL -c 'x=;[[ ${SHELL:$x} == $SHELL ]]';} 2> /dev/null || err_exit '${var:$x} fails when x is null'
504exit $((Errors))
505