xref: /titanic_41/usr/src/lib/libshell/common/tests/quoting.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
30da2e3ebdSchinif	[[ 'hi there' != "hi there" ]]
31da2e3ebdSchinthen	err_exit "single quotes not the same as double quotes"
32da2e3ebdSchinfi
33da2e3ebdSchinx='hi there'
34da2e3ebdSchinif	[[ $x != 'hi there' ]]
35da2e3ebdSchinthen	err_exit "$x not the same as 'hi there'"
36da2e3ebdSchinfi
37da2e3ebdSchinif	[[ $x != "hi there" ]]
38da2e3ebdSchinthen	err_exit "$x not the same as \"hi there \""
39da2e3ebdSchinfi
40da2e3ebdSchinif	[[ \a\b\c\*\|\"\ \\ != 'abc*|" \' ]]
41da2e3ebdSchinthen	err_exit " \\ differs from '' "
42da2e3ebdSchinfi
43da2e3ebdSchinif	[[ "ab\'\"\$(" != 'ab\'\''"$(' ]]
44da2e3ebdSchinthen	err_exit " \"\" differs from '' "
45da2e3ebdSchinfi
46da2e3ebdSchinif	[[ $(print -r - 'abc*|" \') !=  'abc*|" \' ]]
47da2e3ebdSchinthen	err_exit "\$(print -r - '') differs from ''"
48da2e3ebdSchinfi
49da2e3ebdSchinif	[[ $(print -r - "abc*|\" \\") !=  'abc*|" \' ]]
50da2e3ebdSchinthen	err_exit "\$(print -r - '') differs from ''"
51da2e3ebdSchinfi
52da2e3ebdSchinif	[[ "$(print -r - 'abc*|" \')" !=  'abc*|" \' ]]
53da2e3ebdSchinthen	err_exit "\"\$(print -r - '')\" differs from ''"
54da2e3ebdSchinfi
55da2e3ebdSchinif	[[ "$(print -r - "abc*|\" \\")" !=  'abc*|" \' ]]
56da2e3ebdSchinthen	err_exit "\"\$(print -r - "")\" differs from ''"
57da2e3ebdSchinfi
58da2e3ebdSchinif	[[ $(print -r - $(print -r - 'abc*|" \')) !=  'abc*|" \' ]]
59da2e3ebdSchinthen	err_exit "nested \$(print -r - '') differs from ''"
60da2e3ebdSchinfi
61da2e3ebdSchinif	[[ "$(print -r - $(print -r - 'abc*|" \'))" !=  'abc*|" \' ]]
62da2e3ebdSchinthen	err_exit "\"nested \$(print -r - '')\" differs from ''"
63da2e3ebdSchinfi
64da2e3ebdSchinif	[[ $(print -r - "$(print -r - 'abc*|" \')") !=  'abc*|" \' ]]
65da2e3ebdSchinthen	err_exit "nested \"\$(print -r - '')\" differs from ''"
66da2e3ebdSchinfi
67da2e3ebdSchinunset x
68da2e3ebdSchinif	[[ ${x-$(print -r - "abc*|\" \\")} !=  'abc*|" \' ]]
69da2e3ebdSchinthen	err_exit "\${x-\$(print -r - '')} differs from ''"
70da2e3ebdSchinfi
71da2e3ebdSchinif	[[ ${x-$(print -r - "a}c*|\" \\")} !=  'a}c*|" \' ]]
72da2e3ebdSchinthen	err_exit "\${x-\$(print -r - '}')} differs from ''"
73da2e3ebdSchinfi
74da2e3ebdSchinx=$((echo foo)|(cat))
75da2e3ebdSchinif	[[ $x != foo  ]]
76da2e3ebdSchinthen	err_exit "((cmd)|(cmd)) failed"
77da2e3ebdSchinfi
78da2e3ebdSchinx=$(print -r -- "\"$HOME\"")
79da2e3ebdSchinif	[[ $x != '"'$HOME'"' ]]
80da2e3ebdSchinthen	err_exit "nested double quotes failed"
81da2e3ebdSchinfi
82da2e3ebdSchin: ${z="a{b}c"}
83da2e3ebdSchinif	[[ $z != 'a{b}c' ]]
84da2e3ebdSchinthen	err_exit '${z="a{b}c"} not correct'
85da2e3ebdSchinfi
86da2e3ebdSchinunset z
87da2e3ebdSchin: "${z="a{b}c"}"
88da2e3ebdSchinif	[[ $z != 'a{b}c' ]]
89da2e3ebdSchinthen	err_exit '"${z="a{b}c"}" not correct'
90da2e3ebdSchinfi
91da2e3ebdSchinif	[[ $(print -r -- "a\*b") !=  'a\*b' ]]
92da2e3ebdSchinthen	err_exit '$(print -r -- "a\*b") differs from  a\*b'
93da2e3ebdSchinfi
94da2e3ebdSchinunset x
95da2e3ebdSchinif	[[ $(print -r -- "a\*b$x") !=  'a\*b' ]]
96da2e3ebdSchinthen	err_exit '$(print -r -- "a\*b$x") differs from  a\*b'
97da2e3ebdSchinfi
98da2e3ebdSchinx=hello
99da2e3ebdSchinset -- ${x+foo bar bam}
100da2e3ebdSchinif	(( $# !=3 ))
101da2e3ebdSchinthen	err_exit '${x+foo bar bam} does not yield three arguments'
102da2e3ebdSchinfi
103da2e3ebdSchinset -- ${x+foo "bar bam"}
104da2e3ebdSchinif	(( $# !=2 ))
105da2e3ebdSchinthen	err_exit '${x+foo "bar bam"} does not yield two arguments'
106da2e3ebdSchinfi
107da2e3ebdSchinset -- ${x+foo 'bar bam'}
108da2e3ebdSchinif	(( $# !=2 ))
109da2e3ebdSchinthen	err_exit '${x+foo '\''bar bam'\''} does not yield two arguments'
110da2e3ebdSchinfi
111da2e3ebdSchinset -- ${x+foo $x bam}
112da2e3ebdSchinif	(( $# !=3 ))
113da2e3ebdSchinthen	err_exit '${x+foo $x bam} does not yield three arguments'
114da2e3ebdSchinfi
115da2e3ebdSchinset -- ${x+foo "$x" bam}
116da2e3ebdSchinif	(( $# !=3 ))
117da2e3ebdSchinthen	err_exit '${x+foo "$x" bam} does not yield three arguments'
118da2e3ebdSchinfi
119da2e3ebdSchinset -- ${x+"foo $x bam"}
120da2e3ebdSchinif	(( $# !=1 ))
121da2e3ebdSchinthen	err_exit '${x+"foo $x bam"} does not yield one argument'
122da2e3ebdSchinfi
123da2e3ebdSchinset -- "${x+foo $x bam}"
124da2e3ebdSchinif	(( $# !=1 ))
125da2e3ebdSchinthen	err_exit '"${x+foo $x bam}" does not yield one argument'
126da2e3ebdSchinfi
127da2e3ebdSchinset -- ${x+foo "$x "bam}
128da2e3ebdSchinif	(( $# !=2 ))
129da2e3ebdSchinthen	err_exit '${x+foo "$x "bam} does not yield two arguments'
130da2e3ebdSchinfi
131da2e3ebdSchinx="ab$'cd"
132da2e3ebdSchinif	[[ $x != 'ab$'"'cd" ]]
133da2e3ebdSchinthen	err_exit '$'"' inside double quotes not working"
134da2e3ebdSchinfi
135da2e3ebdSchinx=`print 'ab$'`
136da2e3ebdSchinif	[[ $x != 'ab$' ]]
137da2e3ebdSchinthen	err_exit '$'"' inside `` quotes not working"
138da2e3ebdSchinfi
139da2e3ebdSchinunset a
140da2e3ebdSchinx=$(print -r -- "'\
141da2e3ebdSchin\
142da2e3ebdSchin")
143da2e3ebdSchinif	[[ $x != "'" ]]
144da2e3ebdSchinthen	err_exit 'line continuation in double strings not working'
145da2e3ebdSchinfi
146da2e3ebdSchinx=$(print -r -- "'\
147da2e3ebdSchin$a\
148da2e3ebdSchin")
149da2e3ebdSchinif	[[ $x != "'" ]]
150da2e3ebdSchinthen	err_exit 'line continuation in expanded double strings not working'
151da2e3ebdSchinfi
152da2e3ebdSchinx='\*'
153da2e3ebdSchinif	[[ $(print -r -- $x) != '\*' ]]
154da2e3ebdSchinthen	err_exit 'x="\\*";$x != \*'
155da2e3ebdSchinfi
156da2e3ebdSchinx='   hello    world    '
157da2e3ebdSchinset -- $x
158da2e3ebdSchinif	(( $# != 2 ))
159da2e3ebdSchinthen	err_exit 'field splitting error'
160da2e3ebdSchinfi
161da2e3ebdSchinx=$(print -r -- '1234567890123456789012345678901234567890123456789012345678901234567890 \
162da2e3ebdSchin1234567890123456789012345678901234567890123456789012345678901234567890 \
163da2e3ebdSchin1234567890123456789012345678901234567890123456789012345678901234567890 \
164da2e3ebdSchin1234567890123456789012345678901234567890123456789012345678901234567890 \
165da2e3ebdSchin1234567890123456789012345678901234567890123456789012345678901234567890 \
166da2e3ebdSchin1234567890123456789012345678901234567890123456789012345678901234567890 \
167da2e3ebdSchin1234567890123456789012345678901234567890123456789012345678901234567890 \
168da2e3ebdSchin1234567890123456789012345678901234567890123456789012345678901234567890 \
169da2e3ebdSchin1234567890123456789012345678901234567890123456789012345678901234567890 \
170da2e3ebdSchin1234567890123456789012345678901234567890123456789012345678901234567890 \
171da2e3ebdSchin1234567890123456789012345678901234567890123456789012345678901234567890 \
172da2e3ebdSchin1234567890123456789012345678901234567890123456789012345678901234567890 \
173da2e3ebdSchin1234567890123456789012345678901234567890123456789012345678901234567890 \
174da2e3ebdSchin1234567890123456789012345678901234567890123456789012345678901234567890 \
175da2e3ebdSchin1234567890123456789012345678901234567890123456789012345678901234567890')
176da2e3ebdSchinif	(( ${#x} != (15*73-3) ))
177da2e3ebdSchinthen	err_exit "length of x, ${#x}, is incorrect should be $((15*73-3))"
178da2e3ebdSchinfi
179da2e3ebdSchinx='$hi'
180da2e3ebdSchinif	[[ $x\$ != '$hi$' ]]
181da2e3ebdSchinthen	err_exit ' $x\$, with x=$hi, does not expand to $hi$'
182da2e3ebdSchinfi
183da2e3ebdSchinif	[[ $x$ != '$hi$' ]]
184da2e3ebdSchinthen	err_exit ' $x$, with x=$hi, does not expand to $hi$'
185da2e3ebdSchinfi
186da2e3ebdSchinset -- $(/bin/echo foo;sleep 1;/bin/echo bar)
187da2e3ebdSchinif	[[ $# != 2 ]]
188da2e3ebdSchinthen	err_exit 'word splitting after command substitution not working'
189da2e3ebdSchinfi
190da2e3ebdSchinunset q
191da2e3ebdSchinif	[[ "${q:+'}q${q:+'}" != q ]]
192da2e3ebdSchinthen	err_exit 'expansion of "{q:+'\''}" not correct when q unset'
193da2e3ebdSchinfi
194da2e3ebdSchinq=1
195da2e3ebdSchinif	[[ "${q:+'}q${q:+'}" != "'q'" ]]
196da2e3ebdSchinthen	err_exit 'expansion of "{q:+'\''}" not correct when q set'
197da2e3ebdSchinfi
198da2e3ebdSchinx=$'x\' #y'
199da2e3ebdSchinif	[[ $x != "x' #y" ]]
200da2e3ebdSchinthen	err_exit "$'x\' #y'" not working
201da2e3ebdSchinfi
202da2e3ebdSchinx=$q$'x\' #y'
203da2e3ebdSchinif	[[ $x != "1x' #y" ]]
204da2e3ebdSchinthen	err_exit "$q$'x\' #y'" not working
205da2e3ebdSchinfi
206da2e3ebdSchinIFS=,
207da2e3ebdSchinx='a,b\,c,d'
208da2e3ebdSchinset -- $x
209da2e3ebdSchinif	[[ $2 != 'b\' ]]
210da2e3ebdSchinthen	err_exit "field splitting of $x with IFS=$IFS not working"
211da2e3ebdSchinfi
212da2e3ebdSchinfoo=bar
213da2e3ebdSchinbar=$(print -r -- ${foo+\\n\ })
214da2e3ebdSchinif	[[ $bar != '\n ' ]]
215da2e3ebdSchinthen	err_exit '${foo+\\n\ } expansion error'
216da2e3ebdSchinfi
217da2e3ebdSchinunset bar
218da2e3ebdSchinbar=$(print -r -- ${foo+\\n\ $bar})
219da2e3ebdSchinif	[[ $bar != '\n ' ]]
220da2e3ebdSchinthen	err_exit '${foo+\\n\ $bar} expansion error with bar unset'
221da2e3ebdSchinfi
222da2e3ebdSchinx='\\(..\\)|&\|\|\\&\\|'
223da2e3ebdSchinif	[[ $(print -r -- $x) != "$x" ]]
224da2e3ebdSchinthen	err_exit '$x, where x=\\(..\\)|&\|\|\\&\\| not working'
225da2e3ebdSchinfi
226da2e3ebdSchinx='\\('
227da2e3ebdSchinif	[[ $(print -r -- a${x}b) != a"${x}"b ]]
228da2e3ebdSchinthen	err_exit 'a${x}b, where x=\\( not working'
229da2e3ebdSchinfi
230da2e3ebdSchinx=
231da2e3ebdSchinif	[[ $(print -r -- $x'\\1') != '\\1' ]]
232da2e3ebdSchinthen	err_exit 'backreference inside single quotes broken'
233da2e3ebdSchinfi
234da2e3ebdSchinset -- ''
235da2e3ebdSchinset -- "$@"
236da2e3ebdSchinif	(( $# != 1 ))
237da2e3ebdSchinthen	err_exit '"$@" not preserving nulls'
238da2e3ebdSchinfi
239da2e3ebdSchinx=
240da2e3ebdSchinif	[[ $(print -r s"!\2${x}\1\a!") != 's!\2\1\a!' ]]
241da2e3ebdSchinthen	err_exit  'print -r s"!\2${x}\1\a!" not equal s!\2\1\a!'
242da2e3ebdSchinfi
243da2e3ebdSchinif	[[ $(print -r $'foo\n\n\n') != foo ]]
244da2e3ebdSchinthen	err_exit 'trailing newlines on comsubstitution not removed'
245da2e3ebdSchinfi
246da2e3ebdSchinunset x
247da2e3ebdSchinif	[[ ${x:='//'} != '//' ]]
248da2e3ebdSchinthen	err_exit '${x:='//'} != "//"'
249da2e3ebdSchinfi
250da2e3ebdSchinif	[[ $(print -r "\"hi$\"")	!= '"hi$"' ]]
251da2e3ebdSchinthen	err_exit '$\ not correct inside ""'
252da2e3ebdSchinfi
253da2e3ebdSchinunset x
254da2e3ebdSchinif	[[ "${x-a\}b}" != 'a}b' ]]
255da2e3ebdSchinthen	err_exit '"${x-a\}b}" !=  "a}b"'
256da2e3ebdSchinfi
257da2e3ebdSchinif	[[ "\}\]$x\*\{\[\\" != '\}\]\*\{\[\' ]]
258da2e3ebdSchinthen	err_exit '"\}\]$x\*\{\[\\" !=  "\}\]\*\{\[\"'
259da2e3ebdSchinfi
260da2e3ebdSchinfoo=yes
261da2e3ebdSchinif	[[ $(print -r -- {\$foo}) != '{$foo}' ]]
262da2e3ebdSchinthen	err_exit '{\$foo}' not expanded correctly
263da2e3ebdSchinfi
264da2e3ebdSchin[[ foo == $(
265da2e3ebdSchin###########################################################
266da2e3ebdSchin###########################################################
267da2e3ebdSchin###########################################################
268da2e3ebdSchin###########################################################
269da2e3ebdSchin###########################################################
270da2e3ebdSchin###########################################################
271da2e3ebdSchin###########################################################
272da2e3ebdSchin###########################################################
273da2e3ebdSchin###########################################################
274da2e3ebdSchin###########################################################
275da2e3ebdSchin###########################################################
276da2e3ebdSchin###########################################################
277da2e3ebdSchin###########################################################
278da2e3ebdSchin###########################################################
279da2e3ebdSchin###########################################################
280da2e3ebdSchin###########################################################
281da2e3ebdSchin###########################################################
282da2e3ebdSchin###########################################################
283da2e3ebdSchin###########################################################
284da2e3ebdSchin###########################################################
285da2e3ebdSchin###########################################################
286da2e3ebdSchin###########################################################
287da2e3ebdSchin###########################################################
288da2e3ebdSchin###########################################################
289da2e3ebdSchin###########################################################
290da2e3ebdSchin###########################################################
291da2e3ebdSchin###########################################################
292da2e3ebdSchin###########################################################
293da2e3ebdSchin###########################################################
294da2e3ebdSchin###########################################################
295da2e3ebdSchin###########################################################
296da2e3ebdSchin###########################################################
297da2e3ebdSchin###########################################################
298da2e3ebdSchin###########################################################
299da2e3ebdSchin###########################################################
300da2e3ebdSchin###########################################################
301da2e3ebdSchin###########################################################
302da2e3ebdSchin###########################################################
303da2e3ebdSchinprint foo) ]] || err_exit "command subsitution with long comments broken"
304da2e3ebdSchinsubject='some/other/words'
305da2e3ebdSchinre='(?*)/(?*)/(?*)'
306da2e3ebdSchin[[ ${subject/${re}/\3} != words ]] && err_exit 'string replacement with \3 not working'
307da2e3ebdSchin[[ ${subject/${re}/'\3'} != '\3' ]] && err_exit 'string replacement with '"'\3'"' not working'
308da2e3ebdSchin[[ ${subject/${re}/"\\3"} != '\3' ]] && err_exit 'string replacement with "\\3" not working'
309da2e3ebdSchin[[ ${subject/${re}/"\3"} != '\3' ]] && err_exit 'string replacement with "\3" not working'
310da2e3ebdSchinstring='\3'
311da2e3ebdSchin[[ ${subject/${re}/${string}} != words ]] && err_exit 'string replacement with $string not working with string=\3'
312da2e3ebdSchin[[ $(print -r "${subject/${re}/${string}}") != words ]] && err_exit 'string replacement with $string not working with string=\3 using print'
313da2e3ebdSchin[[ ${subject/${re}/"${string}"} != '\3' ]] && err_exit 'string replacement with "$string" not working with  string=\3'
314da2e3ebdSchin[[ $(print -r "${subject/${re}/"${string}"}") != '\3' ]] && err_exit 'string replacement with "$string" not working with  string=\3 using print'
315da2e3ebdSchinstring='\\3'
316da2e3ebdSchin[[ ${subject/${re}/${string}} != '\3' ]] && err_exit 'string replacement with $string not working with string=\\3'
317da2e3ebdSchin[[ ${subject/${re}/"${string}"} != '\\3' ]] && err_exit 'string replacement with "$string" not working with  string=\\3'
318da2e3ebdSchin[[ ${subject/${re}/\4} != '\4' ]] && err_exit 'string replacement with \4 not working'
319da2e3ebdSchin[[ ${subject/${re}/'\4'} != '\4' ]] && err_exit 'string replacement with '\4' not working'
320da2e3ebdSchinstring='\4'
321da2e3ebdSchin[[ ${subject/${re}/${string}} != '\4' ]] && err_exit 'string replacement with $string not working with string=\4'
322da2e3ebdSchin[[ ${subject/${re}/"${string}"} != '\4' ]] && err_exit 'string replacement with "$string" not working with  string=\4'
323da2e3ebdSchinstring='&foo'
324da2e3ebdSchin[[ ${subject/${re}/${string}} != '&foo' ]] && err_exit 'string replacement with $string not working with string=&foo'
325da2e3ebdSchin[[ ${subject/${re}/"${string}"} != '&foo' ]] && err_exit 'string replacement with "$string" not working with  string=&foo'
326da2e3ebdSchin{
327da2e3ebdSchinx=x
328da2e3ebdSchinx=${x:-`id | sed 's/^[^(]*(\([^)]*\)).*/\1/'`}
329da2e3ebdSchin} 2> /dev/null || err_exit 'skipping over `` failed'
330da2e3ebdSchin[[ $x == x ]] || err_exit 'assignment ${x:=`...`} failed'
3317c2fbfb3SApril Chin[[ $($SHELL -c 'print a[') == 'a[' ]] || err_exit "unbalanced '[' in command arg fails"
3327c2fbfb3SApril Chin$SHELL -c $'false && (( `wc -l /dev/null | nawk \'{print $1}\'` > 2 )) && true;:' 2> /dev/null ||  err_exit 'syntax error with ` in arithmetic expression'
3337c2fbfb3SApril Chin{ $SHELL  -c '((  1`: "{ }"` ))' ;} 2> /dev/null || err_exit 'problem with ` inside (())'
3347c2fbfb3SApril Chinvarname=foobarx
3357c2fbfb3SApril Chinx=`print '"\$'${varname}'"'`
3367c2fbfb3SApril Chin[[ $x == '"$foobarx"' ]] ||  err_exit $'\\$\' not handled correctly inside ``'
33734f9b3eeSRoland Mainz
33834f9b3eeSRoland Mainzcopy1=5 copynum=1
33934f9b3eeSRoland Mainzfoo="`eval echo "$"{copy$copynum"-0}"`"
34034f9b3eeSRoland Mainz[[ $foo == "$copy1" ]] || err_exit '$"..." not being ignored inside ``'
34134f9b3eeSRoland Mainz
342da2e3ebdSchinexit $((Errors))
343