xref: /onnv-gate/usr/src/lib/libshell/common/tests/glob.sh (revision 4887:feebf9260c2e)
1*4887Schin########################################################################
2*4887Schin#                                                                      #
3*4887Schin#               This software is part of the ast package               #
4*4887Schin#           Copyright (c) 1982-2007 AT&T Knowledge Ventures            #
5*4887Schin#                      and is licensed under the                       #
6*4887Schin#                  Common Public License, Version 1.0                  #
7*4887Schin#                      by AT&T Knowledge Ventures                      #
8*4887Schin#                                                                      #
9*4887Schin#                A copy of the License is available at                 #
10*4887Schin#            http://www.opensource.org/licenses/cpl1.0.txt             #
11*4887Schin#         (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9)         #
12*4887Schin#                                                                      #
13*4887Schin#              Information and Software Systems Research               #
14*4887Schin#                            AT&T Research                             #
15*4887Schin#                           Florham Park NJ                            #
16*4887Schin#                                                                      #
17*4887Schin#                  David Korn <dgk@research.att.com>                   #
18*4887Schin#                                                                      #
19*4887Schin########################################################################
20*4887Schinfunction err_exit
21*4887Schin{
22*4887Schin	print -u2 -n "\t"
23*4887Schin	print -u2 -r ${Command}[$1]: "${@:2}"
24*4887Schin	((errors++))
25*4887Schin}
26*4887Schinalias err_exit='err_exit $LINENO'
27*4887Schin
28*4887Schininteger aware=0 contrary=0 ignorant=0
29*4887Schin
30*4887Schinfunction test_glob
31*4887Schin{
32*4887Schin	typeset lineno expected drop arg got sep op val add del
33*4887Schin	if	[[ $1 == --* ]]
34*4887Schin	then	del=${1#--}
35*4887Schin		shift
36*4887Schin	fi
37*4887Schin	if	[[ $1 == ++* ]]
38*4887Schin	then	add=${1#++}
39*4887Schin		shift
40*4887Schin	fi
41*4887Schin	lineno=$1 expected=$2
42*4887Schin	shift 2
43*4887Schin	if	(( contrary ))
44*4887Schin	then	if	[[ $expected == "<Beware> "* ]]
45*4887Schin		then	expected=${expected#"<Beware> "}
46*4887Schin			expected="$expected <Beware>"
47*4887Schin		fi
48*4887Schin		if	[[ $expected == *"<aXb> <abd>"* ]]
49*4887Schin		then	expected=${expected/"<aXb> <abd>"/"<abd> <aXb>"}
50*4887Schin		fi
51*4887Schin	fi
52*4887Schin	for arg
53*4887Schin	do	got="$got$sep<$arg>"
54*4887Schin		sep=" "
55*4887Schin	done
56*4887Schin	if	(( ignorant && aware ))
57*4887Schin	then	if	[[ $del ]]
58*4887Schin		then	got="<$del> $got"
59*4887Schin		fi
60*4887Schin		if	[[ $add ]]
61*4887Schin		then	expected="<$add> $expected"
62*4887Schin		fi
63*4887Schin	fi
64*4887Schin	if	[[ $got != "$expected" ]]
65*4887Schin	then	err_exit $lineno "glob: got '$got' expected '$expected'"
66*4887Schin	fi
67*4887Schin}
68*4887Schin
69*4887Schinfunction test_case
70*4887Schin{
71*4887Schin	typeset lineno expected subject pattern got
72*4887Schin	lineno=$1 expected=$2 subject=$3 pattern=$4
73*4887Schin	eval "
74*4887Schin		case $subject in
75*4887Schin		$pattern)	got='<match>' ;;
76*4887Schin		*)		got='<nomatch>' ;;
77*4887Schin		esac
78*4887Schin	"
79*4887Schin	if	[[ $got != "$expected" ]]
80*4887Schin	then	err_exit $lineno "case $subject in $pattern) got '$got' expected '$expected'"
81*4887Schin	fi
82*4887Schin}
83*4887Schin
84*4887SchinCommand=${0##*/}
85*4887Schintmp=/tmp/ksh$$
86*4887Schininteger errors=0
87*4887Schinunset undefined
88*4887Schin
89*4887Schinexport LC_COLLATE=C
90*4887Schin
91*4887Schinmkdir $tmp || err_exit $LINENO "mkdir $tmp failed"
92*4887Schintrap "cd /; rm -rf $tmp" EXIT
93*4887Schincd $tmp || err_exit $LINENO "cd $tmp failed"
94*4887Schinrm -rf *
95*4887Schin
96*4887Schintouch B b
97*4887Schinset -- *
98*4887Schincase $* in
99*4887Schin'b B')	contrary=1 ;;
100*4887Schinb|B)	ignorant=1 ;;
101*4887Schinesac
102*4887Schinset -- $(/bin/sh -c 'echo [a-c]')
103*4887Schincase $* in
104*4887SchinB)	aware=1 ;;
105*4887Schinesac
106*4887Schinrm -rf *
107*4887Schin
108*4887Schintouch a b c d abc abd abe bb bcd ca cb dd de Beware
109*4887Schinmkdir bdir
110*4887Schin
111*4887Schintest_glob $LINENO '<a> <abc> <abd> <abe> <X*>' a* X*
112*4887Schintest_glob $LINENO '<a> <abc> <abd> <abe>' \a*
113*4887Schin
114*4887Schinif	( set --nullglob ) 2>/dev/null
115*4887Schinthen
116*4887Schin	set --nullglob
117*4887Schin
118*4887Schin	test_glob $LINENO '<a> <abc> <abd> <abe>' a* X*
119*4887Schin
120*4887Schin	set --nonullglob
121*4887Schinfi
122*4887Schin
123*4887Schinif	( set --failglob ) 2>/dev/null
124*4887Schinthen
125*4887Schin	set --failglob
126*4887Schin	mkdir tmp
127*4887Schin	touch tmp/l1 tmp/l2 tmp/l3
128*4887Schin
129*4887Schin	test_glob $LINENO '' tmp/l[12] tmp/*4 tmp/*3
130*4887Schin	test_glob $LINENO '' tmp/l[12] tmp/*4 tmp/*3
131*4887Schin
132*4887Schin	rm -r tmp
133*4887Schin	set --nofailglob
134*4887Schinfi
135*4887Schin
136*4887Schintest_glob $LINENO '<bdir/>' b*/
137*4887Schintest_glob $LINENO '<*>' \*
138*4887Schintest_glob $LINENO '<a*>' 'a*'
139*4887Schintest_glob $LINENO '<a*>' a\*
140*4887Schintest_glob $LINENO '<c> <ca> <cb> <a*> <*q*>' c* a\* *q*
141*4887Schintest_glob $LINENO '<**>' "*"*
142*4887Schintest_glob $LINENO '<**>' \**
143*4887Schintest_glob $LINENO '<\.\./*/>' "\.\./*/"
144*4887Schintest_glob $LINENO '<s/\..*//>' 's/\..*//'
145*4887Schintest_glob $LINENO '</^root:/{s/^[!:]*:[!:]*:\([!:]*\).*$/\1/>' "/^root:/{s/^[!:]*:[!:]*:\([!:]*\).*"'$'"/\1/"
146*4887Schintest_glob $LINENO '<abc> <abd> <abe> <bb> <cb>' [a-c]b*
147*4887Schintest_glob ++Beware $LINENO '<abd> <abe> <bb> <bcd> <bdir> <ca> <cb> <dd> <de>' [a-y]*[!c]
148*4887Schintest_glob $LINENO '<abd> <abe>' a*[!c]
149*4887Schin
150*4887Schintouch a-b aXb
151*4887Schin
152*4887Schintest_glob $LINENO '<a-b> <aXb>' a[X-]b
153*4887Schin
154*4887Schintouch .x .y
155*4887Schin
156*4887Schintest_glob --Beware $LINENO '<Beware> <d> <dd> <de>' [!a-c]*
157*4887Schin
158*4887Schinif	mkdir a\*b 2>/dev/null
159*4887Schinthen
160*4887Schin	touch a\*b/ooo
161*4887Schin
162*4887Schin	test_glob $LINENO '<a*b/ooo>' a\*b/*
163*4887Schin	test_glob $LINENO '<a*b/ooo>' a\*?/*
164*4887Schin	test_case $LINENO '<match>' '!7' '*\!*'
165*4887Schin	test_case $LINENO '<match>' 'r.*' '*.\*'
166*4887Schin	test_glob $LINENO '<abc>' a[b]c
167*4887Schin	test_glob $LINENO '<abc>' a["b"]c
168*4887Schin	test_glob $LINENO '<abc>' a[\b]c
169*4887Schin	test_glob $LINENO '<abc>' a?c
170*4887Schin	test_case $LINENO '<match>' 'abc' 'a"b"c'
171*4887Schin	test_case $LINENO '<match>' 'abc' 'a*c'
172*4887Schin	test_case $LINENO '<nomatch>' 'abc' '"a?c"'
173*4887Schin	test_case $LINENO '<nomatch>' 'abc' 'a\*c'
174*4887Schin	test_case $LINENO '<nomatch>' 'abc' 'a\[b]c'
175*4887Schin	test_case $LINENO '<match>' '"$undefined"' '""'
176*4887Schin	test_case $LINENO '<match>' 'abc' 'a["\b"]c'
177*4887Schin
178*4887Schin	rm -rf mkdir a\*b
179*4887Schinfi
180*4887Schin
181*4887Schinmkdir man
182*4887Schinmkdir man/man1
183*4887Schintouch man/man1/sh.1
184*4887Schin
185*4887Schintest_glob $LINENO '<man/man1/sh.1>' */man*/sh.*
186*4887Schintest_glob $LINENO '<man/man1/sh.1>' $(echo */man*/sh.*)
187*4887Schintest_glob $LINENO '<man/man1/sh.1>' "$(echo */man*/sh.*)"
188*4887Schin
189*4887Schintest_case $LINENO '<match>' 'abc' 'a***c'
190*4887Schintest_case $LINENO '<match>' 'abc' 'a*****?c'
191*4887Schintest_case $LINENO '<match>' 'abc' '?*****??'
192*4887Schintest_case $LINENO '<match>' 'abc' '*****??'
193*4887Schintest_case $LINENO '<match>' 'abc' '*****??c'
194*4887Schintest_case $LINENO '<match>' 'abc' '?*****?c'
195*4887Schintest_case $LINENO '<match>' 'abc' '?***?****c'
196*4887Schintest_case $LINENO '<match>' 'abc' '?***?****?'
197*4887Schintest_case $LINENO '<match>' 'abc' '?***?****'
198*4887Schintest_case $LINENO '<match>' 'abc' '*******c'
199*4887Schintest_case $LINENO '<match>' 'abc' '*******?'
200*4887Schintest_case $LINENO '<match>' 'abcdecdhjk' 'a*cd**?**??k'
201*4887Schintest_case $LINENO '<match>' 'abcdecdhjk' 'a**?**cd**?**??k'
202*4887Schintest_case $LINENO '<match>' 'abcdecdhjk' 'a**?**cd**?**??k***'
203*4887Schintest_case $LINENO '<match>' 'abcdecdhjk' 'a**?**cd**?**??***k'
204*4887Schintest_case $LINENO '<match>' 'abcdecdhjk' 'a**?**cd**?**??***k**'
205*4887Schintest_case $LINENO '<match>' 'abcdecdhjk' 'a****c**?**??*****'
206*4887Schintest_case $LINENO '<match>' "'-'" '[-abc]'
207*4887Schintest_case $LINENO '<match>' "'-'" '[abc-]'
208*4887Schintest_case $LINENO '<match>' "'\\'" '\\'
209*4887Schintest_case $LINENO '<match>' "'\\'" '[\\]'
210*4887Schintest_case $LINENO '<match>' "'\\'" "'\\'"
211*4887Schintest_case $LINENO '<match>' "'['" '[[]'
212*4887Schintest_case $LINENO '<match>' '[' '[[]'
213*4887Schintest_case $LINENO '<match>' "'['" '['
214*4887Schintest_case $LINENO '<match>' '[' '['
215*4887Schintest_case $LINENO '<match>' "'[abc'" "'['*"
216*4887Schintest_case $LINENO '<nomatch>' "'[abc'" '[*'
217*4887Schintest_case $LINENO '<match>' '[abc' "'['*"
218*4887Schintest_case $LINENO '<nomatch>' '[abc' '[*'
219*4887Schintest_case $LINENO '<match>' 'abd' "a[b/c]d"
220*4887Schintest_case $LINENO '<match>' 'a/d' "a[b/c]d"
221*4887Schintest_case $LINENO '<match>' 'acd' "a[b/c]d"
222*4887Schintest_case $LINENO '<match>' "']'" '[]]'
223*4887Schintest_case $LINENO '<match>' "'-'" '[]-]'
224*4887Schintest_case $LINENO '<match>' 'p' '[a-\z]'
225*4887Schintest_case $LINENO '<match>' '"/tmp"' '[/\\]*'
226*4887Schintest_case $LINENO '<nomatch>' 'abc' '??**********?****?'
227*4887Schintest_case $LINENO '<nomatch>' 'abc' '??**********?****c'
228*4887Schintest_case $LINENO '<nomatch>' 'abc' '?************c****?****'
229*4887Schintest_case $LINENO '<nomatch>' 'abc' '*c*?**'
230*4887Schintest_case $LINENO '<nomatch>' 'abc' 'a*****c*?**'
231*4887Schintest_case $LINENO '<nomatch>' 'abc' 'a********???*******'
232*4887Schintest_case $LINENO '<nomatch>' "'a'" '[]'
233*4887Schintest_case $LINENO '<nomatch>' 'a' '[]'
234*4887Schintest_case $LINENO '<nomatch>' "'['" '[abc'
235*4887Schintest_case $LINENO '<nomatch>' '[' '[abc'
236*4887Schin
237*4887Schintest_glob ++Beware $LINENO '<b> <bb> <bcd> <bdir>' b*
238*4887Schintest_glob $LINENO '<Beware> <b> <bb> <bcd> <bdir>' [bB]*
239*4887Schin
240*4887Schinif	( set --nocaseglob ) 2>/dev/null
241*4887Schinthen
242*4887Schin	set --nocaseglob
243*4887Schin
244*4887Schin	test_glob $LINENO '<Beware> <b> <bb> <bcd> <bdir>' b*
245*4887Schin	test_glob $LINENO '<Beware> <b> <bb> <bcd> <bdir>' [b]*
246*4887Schin	test_glob $LINENO '<Beware> <b> <bb> <bcd> <bdir>' [bB]*
247*4887Schin
248*4887Schin	set --nonocaseglob
249*4887Schinfi
250*4887Schin
251*4887Schinif	( set -f ) 2>/dev/null
252*4887Schinthen
253*4887Schin	set -f
254*4887Schin
255*4887Schin	test_glob $LINENO '<*>' *
256*4887Schin
257*4887Schin	set +f
258*4887Schinfi
259*4887Schin
260*4887Schinif	( set --noglob ) 2>/dev/null
261*4887Schinthen
262*4887Schin	set --noglob
263*4887Schin
264*4887Schin	test_glob $LINENO '<*>' *
265*4887Schin
266*4887Schin	set --glob
267*4887Schinfi
268*4887Schin
269*4887SchinFIGNORE='.*|*'
270*4887Schintest_glob $LINENO '<*>' *
271*4887Schin
272*4887SchinFIGNORE='.*|*c|*e|?'
273*4887Schintest_glob $LINENO '<a-b> <aXb> <abd> <bb> <bcd> <bdir> <ca> <cb> <dd> <man>' *
274*4887Schin
275*4887SchinFIGNORE='.*|*b|*d|?'
276*4887Schintest_glob $LINENO '<Beware> <abc> <abe> <bdir> <ca> <de> <man>' *
277*4887Schin
278*4887SchinFIGNORE=
279*4887Schintest_glob $LINENO '<man/man1/sh.1>' */man*/sh.*
280*4887Schin
281*4887Schinunset FIGNORE
282*4887Schintest_glob $LINENO '<bb> <ca> <cb> <dd> <de>' ??
283*4887Schintest_glob $LINENO '<man/man1/sh.1>' */man*/sh.*
284*4887Schin
285*4887SchinGLOBIGNORE='.*:*'
286*4887Schinset -- *
287*4887Schinif	[[ $1 == '*' ]]
288*4887Schinthen
289*4887Schin	GLOBIGNORE='.*:*c:*e:?'
290*4887Schin	test_glob $LINENO '<>' *
291*4887Schin
292*4887Schin	GLOBIGNORE='.*:*b:*d:?'
293*4887Schin	test_glob $LINENO '<>' *
294*4887Schin
295*4887Schin	unset GLOBIGNORE
296*4887Schin	test_glob $LINENO '<>' *
297*4887Schin	test_glob $LINENO '<man/man1/sh.1>' */man*/sh.*
298*4887Schin
299*4887Schin	GLOBIGNORE=
300*4887Schin	test_glob $LINENO '<man/man1/sh.1>' */man*/sh.*
301*4887Schinfi
302*4887Schin
303*4887Schinexit $errors
304