xref: /titanic_51/usr/src/lib/libshell/common/tests/quoting2.sh (revision 3e14f97f673e8a630f076077de35afdd43dc1587)
1da2e3ebdSchin########################################################################
2da2e3ebdSchin#                                                                      #
3da2e3ebdSchin#               This software is part of the ast package               #
4*3e14f97fSRoger A. Faulkner#          Copyright (c) 1982-2010 AT&T Intellectual Property          #
5da2e3ebdSchin#                      and is licensed under the                       #
6da2e3ebdSchin#                  Common Public License, Version 1.0                  #
77c2fbfb3SApril Chin#                    by AT&T Intellectual Property                     #
8da2e3ebdSchin#                                                                      #
9da2e3ebdSchin#                A copy of the License is available at                 #
10da2e3ebdSchin#            http://www.opensource.org/licenses/cpl1.0.txt             #
11da2e3ebdSchin#         (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9)         #
12da2e3ebdSchin#                                                                      #
13da2e3ebdSchin#              Information and Software Systems Research               #
14da2e3ebdSchin#                            AT&T Research                             #
15da2e3ebdSchin#                           Florham Park NJ                            #
16da2e3ebdSchin#                                                                      #
17da2e3ebdSchin#                  David Korn <dgk@research.att.com>                   #
18da2e3ebdSchin#                                                                      #
19da2e3ebdSchin########################################################################
20da2e3ebdSchinfunction err_exit
21da2e3ebdSchin{
22da2e3ebdSchin	print -u2 -n "\t"
23da2e3ebdSchin	print -u2 -r ${Command}[$1]: "${@:2}"
24da2e3ebdSchin	let Errors+=1
25da2e3ebdSchin}
26da2e3ebdSchinalias err_exit='err_exit $LINENO'
27da2e3ebdSchin
28da2e3ebdSchinCommand=${0##*/}
29da2e3ebdSchininteger Errors=0
30da2e3ebdSchinset -o noglob
31da2e3ebdSchinif	[[ 'hi there' != "hi there" ]]
32da2e3ebdSchinthen	err_exit "single quotes not the same as double quotes"
33da2e3ebdSchinfi
34da2e3ebdSchinx='hi there'
35da2e3ebdSchinif	[[ $x != 'hi there' ]]
36da2e3ebdSchinthen	err_exit "$x not the same as 'hi there'"
37da2e3ebdSchinfi
38da2e3ebdSchinif	[[ $x != "hi there" ]]
39da2e3ebdSchinthen	err_exit "$x not the same as \"hi there \""
40da2e3ebdSchinfi
41da2e3ebdSchinif	[[ \a\b\c\*\|\"\ \\ != 'abc*|" \' ]]
42da2e3ebdSchinthen	err_exit " \\ differs from '' "
43da2e3ebdSchinfi
44da2e3ebdSchinif	[[ "ab\'\"\$(" != 'ab\'\''"$(' ]]
45da2e3ebdSchinthen	err_exit " \"\" differs from '' "
46da2e3ebdSchinfi
47da2e3ebdSchinif	[[ $(print -r - 'abc*|" \') !=  'abc*|" \' ]]
48da2e3ebdSchinthen	err_exit "\$(print -r - '') differs from ''"
49da2e3ebdSchinfi
50da2e3ebdSchinif	[[ $(print -r - "abc*|\" \\") !=  'abc*|" \' ]]
51da2e3ebdSchinthen	err_exit "\$(print -r - '') differs from ''"
52da2e3ebdSchinfi
53da2e3ebdSchinif	[[ "$(print -r - 'abc*|" \')" !=  'abc*|" \' ]]
54da2e3ebdSchinthen	err_exit "\"\$(print -r - '')\" differs from ''"
55da2e3ebdSchinfi
56da2e3ebdSchinif	[[ "$(print -r - "abc*|\" \\")" !=  'abc*|" \' ]]
57da2e3ebdSchinthen	err_exit "\"\$(print -r - "")\" differs from ''"
58da2e3ebdSchinfi
59da2e3ebdSchinif	[[ $(print -r - "$(print -r - 'abc*|" \')") !=  'abc*|" \' ]]
60da2e3ebdSchinthen	err_exit "nested \$(print -r - '') differs from ''"
61da2e3ebdSchinfi
62da2e3ebdSchinif	[[ "$(print -r - $(print -r - 'abc*|" \'))" !=  'abc*|" \' ]]
63da2e3ebdSchinthen	err_exit "\"nested \$(print -r - '')\" differs from ''"
64da2e3ebdSchinfi
65da2e3ebdSchinif	[[ $(print -r - "$(print -r - 'abc*|" \')") !=  'abc*|" \' ]]
66da2e3ebdSchinthen	err_exit "nested \"\$(print -r - '')\" differs from ''"
67da2e3ebdSchinfi
68da2e3ebdSchinunset x
69da2e3ebdSchinif	[[ ${x-$(print -r - "abc*|\" \\")} !=  'abc*|" \' ]]
70da2e3ebdSchinthen	err_exit "\${x-\$(print -r - '')} differs from ''"
71da2e3ebdSchinfi
72da2e3ebdSchinif	[[ ${x-$(print -r - "a}c*|\" \\")} !=  'a}c*|" \' ]]
73da2e3ebdSchinthen	err_exit "\${x-\$(print -r - '}')} differs from ''"
74da2e3ebdSchinfi
75da2e3ebdSchinx=$((echo foo)|(cat))
76da2e3ebdSchinif	[[ $x != foo  ]]
77da2e3ebdSchinthen	err_exit "((cmd)|(cmd)) failed"
78da2e3ebdSchinfi
79da2e3ebdSchinx=$(print -r -- "\"$HOME\"")
80da2e3ebdSchinif	[[ $x != '"'$HOME'"' ]]
81da2e3ebdSchinthen	err_exit "nested double quotes failed"
82da2e3ebdSchinfi
83da2e3ebdSchin: ${z="a{b}c"}
84da2e3ebdSchinif	[[ $z != 'a{b}c' ]]
85da2e3ebdSchinthen	err_exit '${z="a{b}c"} not correct'
86da2e3ebdSchinfi
87da2e3ebdSchinunset z
88da2e3ebdSchin: "${z="a{b}c"}"
89da2e3ebdSchinif	[[ $z != 'a{b}c' ]]
90da2e3ebdSchinthen	err_exit '"${z="a{b}c"}" not correct'
91da2e3ebdSchinfi
92da2e3ebdSchinif	[[ $(print -r -- "a\*b") !=  'a\*b' ]]
93da2e3ebdSchinthen	err_exit '$(print -r -- "a\*b") differs from  a\*b'
94da2e3ebdSchinfi
95da2e3ebdSchinunset x
96da2e3ebdSchinif	[[ $(print -r -- "a\*b$x") !=  'a\*b' ]]
97da2e3ebdSchinthen	err_exit '$(print -r -- "a\*b$x") differs from  a\*b'
98da2e3ebdSchinfi
99da2e3ebdSchinx=hello
100da2e3ebdSchinset -- ${x+foo bar bam}
101da2e3ebdSchinif	(( $# !=3 ))
102da2e3ebdSchinthen	err_exit '${x+foo bar bam} does not yield three arguments'
103da2e3ebdSchinfi
104da2e3ebdSchinset -- ${x+foo "bar bam"}
105da2e3ebdSchinif	(( $# !=2 ))
106da2e3ebdSchinthen	err_exit '${x+foo "bar bam"} does not yield two arguments'
107da2e3ebdSchinfi
108da2e3ebdSchinset -- ${x+foo 'bar bam'}
109da2e3ebdSchinif	(( $# !=2 ))
110da2e3ebdSchinthen	err_exit '${x+foo '\''bar bam'\''} does not yield two arguments'
111da2e3ebdSchinfi
112da2e3ebdSchinset -- ${x+foo $x bam}
113da2e3ebdSchinif	(( $# !=3 ))
114da2e3ebdSchinthen	err_exit '${x+foo $x bam} does not yield three arguments'
115da2e3ebdSchinfi
116da2e3ebdSchinset -- ${x+foo "$x" bam}
117da2e3ebdSchinif	(( $# !=3 ))
118da2e3ebdSchinthen	err_exit '${x+foo "$x" bam} does not yield three arguments'
119da2e3ebdSchinfi
120da2e3ebdSchinset -- ${x+"foo $x bam"}
121da2e3ebdSchinif	(( $# !=1 ))
122da2e3ebdSchinthen	err_exit '${x+"foo $x bam"} does not yield one argument'
123da2e3ebdSchinfi
124da2e3ebdSchinset -- "${x+foo $x bam}"
125da2e3ebdSchinif	(( $# !=1 ))
126da2e3ebdSchinthen	err_exit '"${x+foo $x bam}" does not yield one argument'
127da2e3ebdSchinfi
128da2e3ebdSchinset -- ${x+foo "$x "bam}
129da2e3ebdSchinif	(( $# !=2 ))
130da2e3ebdSchinthen	err_exit '${x+foo "$x "bam} does not yield two arguments'
131da2e3ebdSchinfi
132da2e3ebdSchinx="ab$'cd"
133da2e3ebdSchinif	[[ $x != 'ab$'"'cd" ]]
134da2e3ebdSchinthen	err_exit '$'"' inside double quotes not working"
135da2e3ebdSchinfi
136da2e3ebdSchinx=`print 'ab$'`
137da2e3ebdSchinif	[[ $x != 'ab$' ]]
138da2e3ebdSchinthen	err_exit '$'"' inside `` quotes not working"
139da2e3ebdSchinfi
140da2e3ebdSchinunset a
141da2e3ebdSchinx=$(print -r -- "'\
142da2e3ebdSchin\
143da2e3ebdSchin")
144da2e3ebdSchinif	[[ $x != "'" ]]
145da2e3ebdSchinthen	err_exit 'line continuation in double strings not working'
146da2e3ebdSchinfi
147da2e3ebdSchinx=$(print -r -- "'\
148da2e3ebdSchin$a\
149da2e3ebdSchin")
150da2e3ebdSchinif	[[ $x != "'" ]]
151da2e3ebdSchinthen	err_exit 'line continuation in expanded double strings not working'
152da2e3ebdSchinfi
153da2e3ebdSchinx='\*'
154da2e3ebdSchinif	[[ $(print -r -- $x) != '\*' ]]
155da2e3ebdSchinthen	err_exit 'x="\\*";$x != \*'
156da2e3ebdSchinfi
157da2e3ebdSchinif	[[ $(print -r -- "\}" ) != '\}' ]]
158da2e3ebdSchinthen	err_exit '(print -r -- "\}"' not working
159da2e3ebdSchinfi
160da2e3ebdSchinif	[[ $(print -r -- "\{" ) != '\{' ]]
161da2e3ebdSchinthen	err_exit 'print -r -- "\{"' not working
162da2e3ebdSchinfi
163da2e3ebdSchin# The following caused a syntax error on earlier versions
164da2e3ebdSchinfoo=foo x=-
165da2e3ebdSchinif	[[  `eval print \\${foo$x}` != foo* ]]
166da2e3ebdSchinthen	err_exit '`eval  print \\${foo$x}`' not working
167da2e3ebdSchinfi
168da2e3ebdSchinif	[[  "`eval print \\${foo$x}`" != foo* ]]
169da2e3ebdSchinthen	err_exit '"`eval  print \\${foo$x}`"' not working
170da2e3ebdSchinfi
171da2e3ebdSchinif	( [[ $() != '' ]] )
172da2e3ebdSchinthen	err_exit '$() not working'
173da2e3ebdSchinfi
174da2e3ebdSchinx=a:b:c
175da2e3ebdSchinset -- $( IFS=:; print $x)
176da2e3ebdSchinif	(( $# != 3))
177da2e3ebdSchinthen	err_exit 'IFS not working correctly with command substitution'
178da2e3ebdSchinfi
179da2e3ebdSchin$SHELL -n 2> /dev/null << \! || err_exit '$(...) bug with ( in comment'
180da2e3ebdSchiny=$(
181da2e3ebdSchin	# ( this line is a bug fix
182da2e3ebdSchin	print hi
183da2e3ebdSchin)
184da2e3ebdSchin!
185da2e3ebdSchinx=
186da2e3ebdSchinfor j in  glob noglob
187da2e3ebdSchindo	for i in 'a\*b' 'a\ b' 'a\bc' 'a\*b' 'a\"b'
188da2e3ebdSchin	do	eval [[ '$('print -r -- \'$i\'\$x')' != "'$i'" ]]  && err_exit "quoting of $i\$x with $j enabled failed"
189da2e3ebdSchin		eval [[ '$('print -r -- \'$i\'\${x%*}')' != "'$i'" ]]  && err_exit "quoting of $i\${x%*} with $j enabled failed"
190da2e3ebdSchin		if	[[ $j == noglob ]]
191da2e3ebdSchin		then	eval [[ '$('print -r -- \'$i\'\${x:-*}')' != "'$i''*'" ]]  && err_exit "quoting of $i\${x:-*} with $j enabled failed"
192da2e3ebdSchin		fi
193da2e3ebdSchin	done
194da2e3ebdSchin	set -f
195da2e3ebdSchindone
196da2e3ebdSchinfoo=foo
197da2e3ebdSchin[[ "$" == '$' ]] || err_exit '"$" != $'
198da2e3ebdSchin[[ "${foo}$" == 'foo$' ]] || err_exit 'foo=foo;"${foo}$" != foo$'
199da2e3ebdSchin[[ "${foo}${foo}$" == 'foofoo$' ]] || err_exit 'foo=foo;"${foo}${foo}$" != foofoo$'
2007c2fbfb3SApril Chinfoo='$ '
2017c2fbfb3SApril Chin[[ "$foo" == ~(Elr)(\\\$|#)\  ]] || err_exit $'\'$ \' not matching RE \\\\\\$|#\''
2027c2fbfb3SApril Chin[[ "$foo" == ~(Elr)('\$'|#)\  ]] || err_exit $'\'$ \' not matching RE \'\\$\'|#\''
2037c2fbfb3SApril Chinfoo='# '
2047c2fbfb3SApril Chin[[ "$foo" == ~(Elr)(\\\$|#)\  ]] || err_exit $'\'# \' not matching RE \\'\$|#\''
2057c2fbfb3SApril Chin[[ "$foo" == ~(Elr)('\$'|#)\  ]] || err_exit $'\'# \' not matching RE \'\\$\'|#\''
2067c2fbfb3SApril Chin[[ '\$' == '\$'* ]] ||   err_exit $'\'\\$\' not matching \'\\$\'*'
20734f9b3eeSRoland Mainz[[ a+a == ~(E)a\+a ]] || err_exit '~(E)a\+a not matching a+a'
20834f9b3eeSRoland Mainz[[ a+a =~ a\+a ]] || err_exit 'RE a\+a not matching a+a'
209da2e3ebdSchinexit $((Errors))
210