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