1da2e3ebdSchin######################################################################## 2da2e3ebdSchin# # 3da2e3ebdSchin# This software is part of the ast package # 4*b30d1939SAndy Fiddaman# Copyright (c) 1982-2012 AT&T Intellectual Property # 5da2e3ebdSchin# and is licensed under the # 6*b30d1939SAndy Fiddaman# Eclipse Public License, Version 1.0 # 77c2fbfb3SApril Chin# by AT&T Intellectual Property # 8da2e3ebdSchin# # 9da2e3ebdSchin# A copy of the License is available at # 10*b30d1939SAndy Fiddaman# http://www.eclipse.org/org/documents/epl-v10.html # 11*b30d1939SAndy Fiddaman# (with md5 checksum b35adb5213ca9657e911e9befb180842) # 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 j=4 30da2e3ebdSchinbase=/home/dgk/foo//bar 31da2e3ebdSchinstring1=$base/abcabcabc 32da2e3ebdSchinif [[ ${string1:0} != "$string1" ]] 33da2e3ebdSchinthen err_exit "string1:0" 34da2e3ebdSchinfi 35da2e3ebdSchinif [[ ${string1: -1} != "c" ]] 36da2e3ebdSchinthen err_exit "string1: -1" 37da2e3ebdSchinfi 38da2e3ebdSchinif [[ ${string1:0:1000} != "$string1" ]] 39da2e3ebdSchinthen err_exit "string1:0" 40da2e3ebdSchinfi 41da2e3ebdSchinif [[ ${string1:1} != "${string1#?}" ]] 42da2e3ebdSchinthen err_exit "string1:1" 43da2e3ebdSchinfi 44da2e3ebdSchinif [[ ${string1:1:4} != home ]] 45da2e3ebdSchinthen err_exit "string1:1:4" 46da2e3ebdSchinfi 47da2e3ebdSchinif [[ ${string1: -5:4} != bcab ]] 48da2e3ebdSchinthen err_exit "string1: -5:4" 49da2e3ebdSchinfi 50da2e3ebdSchinif [[ ${string1:1:j} != home ]] 51da2e3ebdSchinthen err_exit "string1:1:j" 52da2e3ebdSchinfi 53da2e3ebdSchinif [[ ${string1:(j?1:0):j} != home ]] 54da2e3ebdSchinthen err_exit "string1:(j?1:0):j" 55da2e3ebdSchinfi 56da2e3ebdSchinif [[ ${string1%*zzz*} != "$string1" ]] 57da2e3ebdSchinthen err_exit "string1%*zzz*" 58da2e3ebdSchinfi 59da2e3ebdSchinif [[ ${string1%%*zzz*} != "$string1" ]] 60da2e3ebdSchinthen err_exit "string1%%*zzz*" 61da2e3ebdSchinfi 62da2e3ebdSchinif [[ ${string1#*zzz*} != "$string1" ]] 63da2e3ebdSchinthen err_exit "string1#*zzz*" 64da2e3ebdSchinfi 65da2e3ebdSchinif [[ ${string1##*zzz*} != "$string1" ]] 66da2e3ebdSchinthen err_exit "string1##*zzz*" 67da2e3ebdSchinfi 68da2e3ebdSchinif [[ ${string1%+(abc)} != "$base/abcabc" ]] 69da2e3ebdSchinthen err_exit "string1%+(abc)" 70da2e3ebdSchinfi 71da2e3ebdSchinif [[ ${string1%%+(abc)} != "$base/" ]] 72da2e3ebdSchinthen err_exit "string1%%+(abc)" 73da2e3ebdSchinfi 74da2e3ebdSchinif [[ ${string1%/*} != "$base" ]] 75da2e3ebdSchinthen err_exit "string1%/*" 76da2e3ebdSchinfi 77da2e3ebdSchinif [[ "${string1%/*}" != "$base" ]] 78da2e3ebdSchinthen err_exit '"string1%/*"' 79da2e3ebdSchinfi 80da2e3ebdSchinif [[ ${string1%"/*"} != "$string1" ]] 81da2e3ebdSchinthen err_exit 'string1%"/*"' 82da2e3ebdSchinfi 83da2e3ebdSchinif [[ ${string1%%/*} != "" ]] 84da2e3ebdSchinthen err_exit "string1%%/*" 85da2e3ebdSchinfi 86da2e3ebdSchinif [[ ${string1#*/bar} != /abcabcabc ]] 87da2e3ebdSchinthen err_exit "string1#*bar" 88da2e3ebdSchinfi 89da2e3ebdSchinif [[ ${string1##*/bar} != /abcabcabc ]] 90da2e3ebdSchinthen err_exit "string1#*bar" 91da2e3ebdSchinfi 92da2e3ebdSchinif [[ "${string1#@(*/bar|*/foo)}" != //bar/abcabcabc ]] 93da2e3ebdSchinthen err_exit "string1#@(*/bar|*/foo)" 94da2e3ebdSchinfi 95da2e3ebdSchinif [[ ${string1##@(*/bar|*/foo)} != /abcabcabc ]] 96da2e3ebdSchinthen err_exit "string1##@(*/bar|*/foo)" 97da2e3ebdSchinfi 98da2e3ebdSchinif [[ ${string1##*/@(bar|foo)} != /abcabcabc ]] 99da2e3ebdSchinthen err_exit "string1##*/@(bar|foo)" 100da2e3ebdSchinfi 101da2e3ebdSchinfoo=abc 102da2e3ebdSchinif [[ ${foo#a[b*} != abc ]] 103da2e3ebdSchinthen err_exit "abc#a[b*} != abc" 104da2e3ebdSchinfi 105da2e3ebdSchinif [[ ${foo//[0-9]/bar} != abc ]] 106da2e3ebdSchinthen err_exit '${foo//[0-9]/bar} not expanding correctly' 107da2e3ebdSchinfi 108da2e3ebdSchinfoo='(abc)' 109da2e3ebdSchinif [[ ${foo#'('} != 'abc)' ]] 110da2e3ebdSchinthen err_exit "(abc)#( != abc)" 111da2e3ebdSchinfi 112da2e3ebdSchinif [[ ${foo%')'} != '(abc' ]] 113da2e3ebdSchinthen err_exit "(abc)%) != (abc" 114da2e3ebdSchinfi 115da2e3ebdSchinfoo=a123b456c 116da2e3ebdSchinif [[ ${foo/[0-9]?/""} != a3b456c ]] 117da2e3ebdSchinthen err_exit '${foo/[0-9]?/""} not expanding correctly' 118da2e3ebdSchinfi 119da2e3ebdSchinif [[ ${foo//[0-9]/""} != abc ]] 120da2e3ebdSchinthen err_exit '${foo//[0-9]/""} not expanding correctly' 121da2e3ebdSchinfi 122da2e3ebdSchinif [[ ${foo/#a/b} != b123b456c ]] 123da2e3ebdSchinthen err_exit '${foo/#a/b} not expanding correctly' 124da2e3ebdSchinfi 125da2e3ebdSchinif [[ ${foo/#?/b} != b123b456c ]] 126da2e3ebdSchinthen err_exit '${foo/#?/b} not expanding correctly' 127da2e3ebdSchinfi 128da2e3ebdSchinif [[ ${foo/%c/b} != a123b456b ]] 129da2e3ebdSchinthen err_exit '${foo/%c/b} not expanding correctly' 130da2e3ebdSchinfi 131da2e3ebdSchinif [[ ${foo/%?/b} != a123b456b ]] 132da2e3ebdSchinthen err_exit '${foo/%?/b} not expanding correctly' 133da2e3ebdSchinfi 134da2e3ebdSchinwhile read -r pattern string expected 135da2e3ebdSchindo if (( expected )) 136da2e3ebdSchin then if [[ $string != $pattern ]] 137da2e3ebdSchin then err_exit "$pattern does not match $string" 138da2e3ebdSchin fi 139da2e3ebdSchin if [[ ${string##$pattern} != "" ]] 140da2e3ebdSchin then err_exit "\${$string##$pattern} not null" 141da2e3ebdSchin fi 142da2e3ebdSchin if [ "${string##$pattern}" != '' ] 143da2e3ebdSchin then err_exit "\"\${$string##$pattern}\" not null" 144da2e3ebdSchin fi 145da2e3ebdSchin if [[ ${string/$pattern} != "" ]] 146da2e3ebdSchin then err_exit "\${$string/$pattern} not null" 147da2e3ebdSchin fi 148da2e3ebdSchin else if [[ $string == $pattern ]] 149da2e3ebdSchin then err_exit "$pattern matches $string" 150da2e3ebdSchin fi 151da2e3ebdSchin fi 152da2e3ebdSchindone <<- \EOF 153da2e3ebdSchin +(a)*+(a) aabca 1 154da2e3ebdSchin !(*.o) foo.o 0 155da2e3ebdSchin !(*.o) foo.c 1 156da2e3ebdSchinEOF 157da2e3ebdSchinxx=a/b/c/d/e 158da2e3ebdSchinyy=${xx#*/} 159da2e3ebdSchinif [[ $yy != b/c/d/e ]] 160da2e3ebdSchinthen err_exit '${xx#*/} != a/b/c/d/e when xx=a/b/c/d/e' 161da2e3ebdSchinfi 162da2e3ebdSchinif [[ ${xx//\//\\} != 'a\b\c\d\e' ]] 163da2e3ebdSchinthen err_exit '${xx//\//\\} not working' 164da2e3ebdSchinfi 165da2e3ebdSchinx=[123]def 166*b30d1939SAndy Fiddamanif [[ "${x//\[@(*)\]/\{\1\}}" != {123}def ]] 167da2e3ebdSchinthen err_exit 'closing brace escape not working' 168da2e3ebdSchinfi 1697c2fbfb3SApril Chinxx=%28text%29 1707c2fbfb3SApril Chinif [[ ${xx//%28/abc\)} != 'abc)text%29' ]] 1717c2fbfb3SApril Chinthen err_exit '${xx//%28/abc\)} not working' 1727c2fbfb3SApril Chinfi 1737c2fbfb3SApril Chinxx='a:b' 1747c2fbfb3SApril Chinstr='(){}[]*?|&^%$#@l' 1757c2fbfb3SApril Chinfor ((i=0 ; i < ${#str}; i++)) 1767c2fbfb3SApril Chindo [[ $(eval print -r -- \"\${xx//:/\\${str:i:1}}\") == "a${str:i:1}b" ]] || err_exit "substitution of \\${str:i:1}} failed" 1777c2fbfb3SApril Chin [[ $(eval print -rn -- \"\${xx//:/\'${str:i:1}\'}\") == "a${str:i:1}b" ]] || err_exit "substitution of '${str:i:1}' failed" 1787c2fbfb3SApril Chin [[ $(eval print -r -- \"\${xx//:/\"${str:i:1}\"}\") == "a${str:i:1}b" ]] || err_exit "substitution of \"${str:i:1}\" failed" 1797c2fbfb3SApril Chindone 1807c2fbfb3SApril Chin[[ ${xx//:/\\n} == 'a\nb' ]] || err_exit "substituion of \\\\n failed" 1817c2fbfb3SApril Chin[[ ${xx//:/'\n'} == 'a\nb' ]] || err_exit "substituion of '\\n' failed" 1827c2fbfb3SApril Chin[[ ${xx//:/"\n"} == 'a\nb' ]] || err_exit "substituion of \"\\n\" failed" 1837c2fbfb3SApril Chin[[ ${xx//:/$'\n'} == $'a\nb' ]] || err_exit "substituion of \$'\\n' failed" 184da2e3ebdSchinunset foo 185da2e3ebdSchinfoo=one/two/three 186da2e3ebdSchinif [[ ${foo//'/'/_} != one_two_three ]] 187da2e3ebdSchinthen err_exit 'single quoting / in replacements failed' 188da2e3ebdSchinfi 189da2e3ebdSchinif [[ ${foo//"/"/_} != one_two_three ]] 190da2e3ebdSchinthen err_exit 'double quoting / in replacements failed' 191da2e3ebdSchinfi 192da2e3ebdSchinif [[ ${foo//\//_} != one_two_three ]] 193da2e3ebdSchinthen err_exit 'escaping / in replacements failed' 194da2e3ebdSchinfi 19534f9b3eeSRoland Mainzfunction myexport 196da2e3ebdSchin{ 197da2e3ebdSchin nameref var=$1 198da2e3ebdSchin if (( $# > 1 )) 199da2e3ebdSchin then export $1=$2 200da2e3ebdSchin fi 201da2e3ebdSchin if (( $# > 2 )) 202da2e3ebdSchin then print $(myexport "$1" "$3" ) 203da2e3ebdSchin return 204da2e3ebdSchin fi 205da2e3ebdSchin typeset val 206da2e3ebdSchin val=$(export | grep "^$1=") 207da2e3ebdSchin print ${val#"$1="} 20834f9b3eeSRoland Mainz 209da2e3ebdSchin} 210da2e3ebdSchinexport dgk=base 211da2e3ebdSchinif [[ $(myexport dgk fun) != fun ]] 212da2e3ebdSchinthen err_exit 'export inside function not working' 213da2e3ebdSchinfi 214da2e3ebdSchinval=$(export | grep "^dgk=") 215da2e3ebdSchinif [[ ${val#dgk=} != base ]] 216da2e3ebdSchinthen err_exit 'export not restored after function call' 217da2e3ebdSchinfi 218da2e3ebdSchinif [[ $(myexport dgk fun fun2) != fun2 ]] 219da2e3ebdSchinthen err_exit 'export inside function not working with recursive function' 220da2e3ebdSchinfi 221da2e3ebdSchinval=$(export | grep "^dgk=") 222da2e3ebdSchinif [[ ${val#dgk=} != base ]] 223da2e3ebdSchinthen err_exit 'export not restored after recursive function call' 224da2e3ebdSchinfi 225da2e3ebdSchinif [[ $(dgk=try3 myexport dgk) != try3 ]] 226da2e3ebdSchinthen err_exit 'name=value not added to export list with function call' 227da2e3ebdSchinfi 228da2e3ebdSchinval=$(export | grep "^dgk=") 229da2e3ebdSchinif [[ ${val#dgk=} != base ]] 230da2e3ebdSchinthen err_exit 'export not restored name=value function call' 231da2e3ebdSchinfi 232da2e3ebdSchinunset zzz 233da2e3ebdSchinif [[ $(myexport zzz fun) != fun ]] 234da2e3ebdSchinthen err_exit 'export inside function not working for zzz' 235da2e3ebdSchinfi 236da2e3ebdSchinif [[ $(export | grep "zzz=") ]] 237da2e3ebdSchinthen err_exit 'zzz exported after function call' 238da2e3ebdSchinfi 239da2e3ebdSchinset -- foo/bar bam/yes last/file/done 240da2e3ebdSchinif [[ ${@/*\/@(*)/\1} != 'bar yes done' ]] 241da2e3ebdSchinthen err_exit '\1 not working with $@' 242da2e3ebdSchinfi 243da2e3ebdSchinvar=(foo/bar bam/yes last/file/done) 244da2e3ebdSchinif [[ ${var[@]/*\/@(*)/\1} != 'bar yes done' ]] 245da2e3ebdSchinthen err_exit '\1 not working with ${var[@]}' 246da2e3ebdSchinfi 247da2e3ebdSchinvar='abc_d2ef.462abc %%' 248da2e3ebdSchinif [[ ${var/+(\w)/Q} != 'Q.462abc %%' ]] 249da2e3ebdSchinthen err_exit '${var/+(\w)/Q} not workding' 250da2e3ebdSchinfi 251da2e3ebdSchinif [[ ${var//+(\w)/Q} != 'Q.Q %%' ]] 252da2e3ebdSchinthen err_exit '${var//+(\w)/Q} not workding' 253da2e3ebdSchinfi 254da2e3ebdSchinif [[ ${var//+(\S)/Q} != 'Q Q' ]] 255da2e3ebdSchinthen err_exit '${var//+(\S)/Q} not workding' 256da2e3ebdSchinfi 257*b30d1939SAndy Fiddamanvar=$($SHELL -c 'v=/vin:/usr/vin r=vin; : ${v//vin/${r//v/b}};typeset -p .sh.match') 2> /dev/null 258*b30d1939SAndy Fiddaman[[ $var == 'typeset -a .sh.match=((vin vin) )' ]] || err_exit '.sh.match not correct when replacement pattern contains a substring match' 259da2e3ebdSchinfoo='foo+bar+' 260da2e3ebdSchin[[ $(print -r -- ${foo//+/'|'}) != 'foo|bar|' ]] && err_exit "\${foobar//+/'|'}" 261da2e3ebdSchin[[ $(print -r -- ${foo//+/"|"}) != 'foo|bar|' ]] && err_exit '${foobar//+/"|"}' 262da2e3ebdSchin[[ $(print -r -- "${foo//+/'|'}") != 'foo|bar|' ]] && err_exit '"${foobar//+/'"'|'"'}"' 263da2e3ebdSchin[[ $(print -r -- "${foo//+/"|"}") != 'foo|bar|' ]] && err_exit '"${foobar//+/"|"}"' 264da2e3ebdSchinunset x 265da2e3ebdSchinx=abcedfg 266da2e3ebdSchin: ${x%@(d)f@(g)} 267da2e3ebdSchin[[ ${.sh.match[0]} == dfg ]] || err_exit '.sh.match[0] not dfg' 268da2e3ebdSchin[[ ${.sh.match[1]} == d ]] || err_exit '.sh.match[1] not d' 269da2e3ebdSchin[[ ${.sh.match[2]} == g ]] || err_exit '.sh.match[2] not g' 270da2e3ebdSchinx=abcedddfg 271da2e3ebdSchin: ${x%%+(d)f@(g)} 272da2e3ebdSchin[[ ${.sh.match[1]} == ddd ]] || err_exit '.sh.match[1] not ddd' 273da2e3ebdSchinunset a b 274da2e3ebdSchina='\[abc @(*) def\]' 275da2e3ebdSchinb='[abc 123 def]' 276da2e3ebdSchin[[ ${b//$a/\1} == 123 ]] || err_exit "\${var/pattern} not working with \[ in pattern" 2777c2fbfb3SApril Chinunset foo 2787c2fbfb3SApril Chinfoo='(win32.i386) ' 27934f9b3eeSRoland Mainz[[ ${foo/'('/'(x11-'} == '(x11-win32.i386) ' ]] || err_exit "\${var/pattern} not working with ' in pattern" 2807c2fbfb3SApril Chin$SHELL -c $'v=\'$(hello)\'; [[ ${v//\'$(\'/-I\'$(\'} == -I"$v" ]]' 2> /dev/null || err_exit "\${var/pattern} not working with \$( as pattern" 281da2e3ebdSchinunset X 282da2e3ebdSchin$SHELL -c '[[ ! ${X[@]:0:300} ]]' 2> /dev/null || err_exit '${X[@]:0:300} with X undefined fails' 283da2e3ebdSchin$SHELL -c '[[ ${@:0:300} == "$0" ]]' 2> /dev/null || err_exit '${@:0:300} with no arguments fails' 284da2e3ebdSchini=20030704 285da2e3ebdSchin[[ ${i#{6}(?)} == 04 ]] || err_exit '${i#{6}(?)} not working' 286da2e3ebdSchin[[ ${i#{6,6}(?)} == 04 ]] || err_exit '${i#{6,6}(?)} not working' 287da2e3ebdSchinLC_ALL=posix 288da2e3ebdSchini=" ." 289da2e3ebdSchin[[ $(printf "<%s>\n" ${i#' '}) == '<.>' ]] || err_exit 'printf "<%s>\n" ${i#' '} failed' 290da2e3ebdSchinunset x 291da2e3ebdSchinx=foo 292da2e3ebdSchin[[ "${x%o}(1)" == "fo(1)" ]] || err_exit 'print ${}() treated as pattern' 293da2e3ebdSchinunset i pattern string 294da2e3ebdSchinstring=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghigklmnopqrstuvwxyz 295da2e3ebdSchininteger i 296da2e3ebdSchinfor((i=0; i < ${#string}; i++)) 297da2e3ebdSchindo pattern+='@(?)' 298da2e3ebdSchindone 299da2e3ebdSchin[[ $(string=$string $SHELL -c ": \${string/$pattern/}; print \${.sh.match[26]}") == Z ]] || err_exit -u2 'sh.match[26] not Z' 300da2e3ebdSchin: ${string/$pattern/} 301da2e3ebdSchin(( ${#.sh.match[@]} == 53 )) || err_exit '.sh.match has wrong number of elements' 30234f9b3eeSRoland Mainz[[ ${.sh.match[@]:2:4} == 'B C D E' ]] || err_exit '${.sh.match[@]:2:4} incorrect' 303da2e3ebdSchin 304da2e3ebdSchinD=$';' E=$'\\\\' Q=$'"' S=$'\'' M='nested pattern substitution failed' 305da2e3ebdSchin 306da2e3ebdSchinx='-(-)-' 307da2e3ebdSchin[[ ${x/*%(())*/\1} == '(-)' ]] || err_exit $M 308da2e3ebdSchinx='-(-)-)-' 309da2e3ebdSchin[[ ${x/*%(())*/\1} == '(-)' ]] || err_exit $M 310da2e3ebdSchinx='-(-()-)-' 311da2e3ebdSchin[[ ${x/*%(())*/\1} == '()' ]] || err_exit $M 312da2e3ebdSchinx='-(-\)-)-' 313da2e3ebdSchin[[ ${x/*%(())*/\1} == '(-\)' ]] || err_exit $M 314da2e3ebdSchinx='-(-\\)-)-' 315da2e3ebdSchin[[ ${x/*%(())*/\1} == '(-\\)' ]] || err_exit $M 316da2e3ebdSchinx='-(-(-)-' 317da2e3ebdSchin[[ ${x/*%(())*/\1} == '(-)' ]] || err_exit $M 318da2e3ebdSchinx='-(-(-)-)-' 319da2e3ebdSchin[[ ${x/*%(())*/\1} == '(-)' ]] || err_exit $M 320da2e3ebdSchinx='-(-[-]-)-' 321da2e3ebdSchin[[ ${x/*%(()[])*/\1} == '(-[-]-)' ]] || err_exit $M 322da2e3ebdSchinx='-[-(-)-]-' 323da2e3ebdSchin[[ ${x/*%(()[])*/\1} == '(-)' ]] || err_exit $M 324da2e3ebdSchinx='-(-[-)-]-' 325da2e3ebdSchin[[ ${x/*%(()[])*/\1} == '-(-[-)-]-' ]] || err_exit $M 326da2e3ebdSchinx='-(-[-]-)-' 327da2e3ebdSchin[[ ${x/*%([]())*/\1} == '[-]' ]] || err_exit $M 328da2e3ebdSchinx='-[-(-)-]-' 329da2e3ebdSchin[[ ${x/*%([]())*/\1} == '[-(-)-]' ]] || err_exit $M 330da2e3ebdSchinx='-(-[-)-]-' 331da2e3ebdSchin[[ ${x/*%([]())*/\1} == '-(-[-)-]-' ]] || err_exit $M 332da2e3ebdSchin 333da2e3ebdSchinx='-((-))-' 334da2e3ebdSchin[[ ${x/*%(())*/\1} == '(-)' ]] || err_exit $M 335da2e3ebdSchinx='-((-))-' 336da2e3ebdSchin[[ ${x/~(-g)*%(())*/\1} == '((-))-' ]] || err_exit $M 337da2e3ebdSchinx='-((-))-' 338da2e3ebdSchin[[ ${x/~(-g:*)*%(())*/\1} == '(-)' ]] || err_exit $M 339da2e3ebdSchinx='-((-))-' 340da2e3ebdSchin[[ ${x/~(+g)*%(())*/\1} == '(-)' ]] || err_exit $M 341da2e3ebdSchinx='-((-))-' 342da2e3ebdSchin[[ ${x/~(+g:*)*%(())*/\1} == '(-)' ]] || err_exit $M 343da2e3ebdSchinx='-((-))-' 344da2e3ebdSchin[[ ${x/*(?)*%(())*(?)*/:\1:\2:\3:} == ':-(:(-):)-:' ]] || err_exit $M 345da2e3ebdSchinx='-((-))-' 346da2e3ebdSchin[[ ${x/~(-g)*(?)*%(())*(?)*/:\1:\2:\3:} == '::((-))::-' ]] || err_exit $M 347da2e3ebdSchinx='-((-))-' 348da2e3ebdSchin[[ ${x/~(-g:*(?))*%(())*(?)*/:\1:\2:\3:} == '::(-):)-:' ]] || err_exit $M 349da2e3ebdSchinx='-((-))-' 350da2e3ebdSchin[[ ${x/~(+g)*(?)*%(())*(?)*/:\1:\2:\3:} == ':-(:(-):)-:' ]] || err_exit $M 351da2e3ebdSchinx='-((-))-' 352da2e3ebdSchin[[ ${x/~(+g:*(?))*%(())*(?)*/:\1:\2:\3:} == ':-(:(-):)-:' ]] || err_exit $M 353da2e3ebdSchinx='call(a+b,x/(c/d),(0));' 354*b30d1939SAndy Fiddaman[[ ${x/+([[:alnum:]])*([[:space:]])@(*%(()))*/:\1:\2:\3:} == ':call::(a+b,x/(c/d),(0)):' ]] || err_exit $M 355da2e3ebdSchin 356da2e3ebdSchinx='-(-;-)-' 357da2e3ebdSchin[[ ${x/*%(()D${D})*/\1} == '-(-;-)-' ]] || err_exit $M 358da2e3ebdSchinx='-(-);-' 359da2e3ebdSchin[[ ${x/*%(()D${D})*/\1} == '(-)' ]] || err_exit $M 360da2e3ebdSchinx='-(-)\;-' 361da2e3ebdSchin[[ ${x/*%(()D${D})*/\1} == '(-)' ]] || err_exit $M 362da2e3ebdSchinx='-(-\;-)-' 363da2e3ebdSchin[[ ${x/*%(()D${D}E${E})*/\1} == '(-\;-)' ]] || err_exit $M 364da2e3ebdSchinx='-(-)\;-' 365da2e3ebdSchin[[ ${x/*%(()D${D}E${E})*/\1} == '(-)' ]] || err_exit $M 366da2e3ebdSchinx='-(-(-)\;-)-' 367da2e3ebdSchin[[ ${x/*%(()D${D}E${E})*/\1} == '(-)' ]] || err_exit $M 368da2e3ebdSchin 369da2e3ebdSchinx='-(-")"-)-' 370da2e3ebdSchin[[ ${x/*%(()Q${Q})*/\1} == '(-")"-)' ]] || err_exit $M 371da2e3ebdSchinx='-(-\")"-)-' 372da2e3ebdSchin[[ ${x/*%(()Q${Q})*/\1} == '(-\")"-)' ]] || err_exit $M 373da2e3ebdSchinx='-(-\")\"-)-' 374da2e3ebdSchin[[ ${x/*%(()Q${Q})*/\1} == '(-\")\"-)' ]] || err_exit $M 375da2e3ebdSchinx=$'-(-\\\'")\\\'-)-' 376da2e3ebdSchin[[ ${x/*%(()Q${S}Q${Q})*/\1} == $'(-\\\'")\\\'-)' ]] || err_exit $M 377da2e3ebdSchinx=$'-(-\\\'")"-)-' 378da2e3ebdSchin[[ ${x/*%(()Q${S}Q${Q})*/\1} == $'-(-\\\'")"-)-' ]] || err_exit $M 379da2e3ebdSchinx=$'-(-\\\'")"\'-)-' 380da2e3ebdSchin[[ ${x/*%(()Q${S}Q${Q})*/\1} == $'(-\\\'")"\'-)' ]] || err_exit $M 381da2e3ebdSchinx=$'-(-\\"\')\'\\"-)-' 382da2e3ebdSchin[[ ${x/*%(()Q${S}Q${Q})*/\1} == $'(-\\"\')\'\\"-)' ]] || err_exit $M 383da2e3ebdSchinx=$'-(-\')\\\'\'-)-' 384da2e3ebdSchin[[ ${x/*%(()Q${S}Q${Q})*/\1} == $'-(-\')\\\'\'-)-' ]] || err_exit $M 385da2e3ebdSchinx=$'-(-\'")\'-)-' 386da2e3ebdSchin[[ ${x/*%(()L${S}Q${Q})*/\1} == $'(-\'")\'-)' ]] || err_exit $M 387da2e3ebdSchinx=$'-(-\\\'")"-)-' 388da2e3ebdSchin[[ ${x/*%(()L${S}Q${Q})*/\1} == $'-(-\\\'")"-)-' ]] || err_exit $M 389da2e3ebdSchinx=$'-(-\\\'")"\'-)-' 390da2e3ebdSchin[[ ${x/*%(()L${S}Q${Q})*/\1} == $'(-\\\'")"\'-)' ]] || err_exit $M 391da2e3ebdSchinx=$'-(-\\"\')\'\\"-)-' 392da2e3ebdSchin[[ ${x/*%(()L${S}Q${Q})*/\1} == $'(-\\"\')\'\\"-)' ]] || err_exit $M 393da2e3ebdSchinx=$'-(-\')\\\'\'-)-' 394da2e3ebdSchin[[ ${x/*%(()L${S}Q${Q})*/\1} == $'-(-\')\\\'\'-)-' ]] || err_exit $M 395da2e3ebdSchinx='-(-")"-)-' 396da2e3ebdSchin[[ ${x/*%(()Q${Q})*/\1} == '(-")"-)' ]] || err_exit $M 397da2e3ebdSchinx='-(-\")"-)-' 398da2e3ebdSchin[[ ${x/*%(()Q${Q})*/\1} == '(-\")"-)' ]] || err_exit $M 399da2e3ebdSchinx='-(-\")\"-)-' 400da2e3ebdSchin[[ ${x/*%(()Q${Q})*/\1} == '(-\")\"-)' ]] || err_exit $M 401da2e3ebdSchin 402da2e3ebdSchinx='-(-\)-)-' 403da2e3ebdSchin[[ ${x/*%(()E${E})*/\1} == '(-\)-)' ]] || err_exit $M 404da2e3ebdSchinx='-(-\\)-)-' 405da2e3ebdSchin[[ ${x/*%(()E${E})*/\1} == '(-\\)' ]] || err_exit $M 406da2e3ebdSchinx='-(-\")"-)-' 407da2e3ebdSchin[[ ${x/*%(()E${E}Q${Q})*/\1} == '(-\")' ]] || err_exit $M 408da2e3ebdSchinx='-(-\")\"-)-' 409da2e3ebdSchin[[ ${x/*%(()E${E}Q${Q})*/\1} == '(-\")' ]] || err_exit $M 410da2e3ebdSchinx=$'-(-\'")"-)-' 411da2e3ebdSchin[[ ${x/*%(()E${E}Q${S}Q${Q})*/\1} == $'-(-\'")"-)-' ]] || err_exit $M 412da2e3ebdSchinx=$'-(-\\\'")"-)-' 413da2e3ebdSchin[[ ${x/*%(()E${E}Q${S}Q${Q})*/\1} == $'(-\\\'")"-)' ]] || err_exit $M 414da2e3ebdSchinx=$'-(-\\"\')\'\\"-)-' 415da2e3ebdSchin[[ ${x/*%(()E${E}Q${S}Q${Q})*/\1} == $'(-\\"\')\'\\"-)' ]] || err_exit $M 416da2e3ebdSchinx=$'-(-\\\'")"-)-' 417da2e3ebdSchin[[ ${x/*%(()E${E}L${S}Q${Q})*/\1} == $'(-\\\'")"-)' ]] || err_exit $M 418da2e3ebdSchinx=$'-(-\\"\')\'\\"-)-' 419da2e3ebdSchin[[ ${x/*%(()E${E}L${S}Q${Q})*/\1} == $'(-\\"\')\'\\"-)' ]] || err_exit $M 420da2e3ebdSchinx=$'-(-\\"\')\\\'\\"-)-' 421da2e3ebdSchin[[ ${x/*%(()E${E}L${S}Q${Q})*/\1} == $'(-\\"\')\\\'\\"-)' ]] || err_exit $M 422da2e3ebdSchinx=$'-(-\\"\')\\\'\\"\'-)-' 423da2e3ebdSchin[[ ${x/*%(()E${E}L${S}Q${Q})*/\1} == $'-(-\\"\')\\\'\\"\'-)-' ]] || err_exit $M 424da2e3ebdSchin 425da2e3ebdSchinx='-(-;-)-' 426da2e3ebdSchin[[ ${x/*%(()D\;)*/\1} == '-(-;-)-' ]] || err_exit $M 427da2e3ebdSchinx='-(-);-' 428da2e3ebdSchin[[ ${x/*%(()D\;)*/\1} == '(-)' ]] || err_exit $M 429da2e3ebdSchinx='-(-)\;-' 430da2e3ebdSchin[[ ${x/*%(()D\;)*/\1} == '(-)' ]] || err_exit $M 431da2e3ebdSchinx='-(-\;-)-' 432da2e3ebdSchin[[ ${x/*%(()D\;E\\)*/\1} == '(-\;-)' ]] || err_exit $M 433da2e3ebdSchinx='-(-);-' 434da2e3ebdSchin[[ ${x/*%(()D\;E\\)*/\1} == '(-)' ]] || err_exit $M 435da2e3ebdSchinx='-(-)\;-' 436da2e3ebdSchin[[ ${x/*%(()D\;E\\)*/\1} == '(-)' ]] || err_exit $M 437da2e3ebdSchinx='-(-(-)\;-)-' 438da2e3ebdSchin[[ ${x/*%(()D\;E\\)*/\1} == '(-)' ]] || err_exit $M 439da2e3ebdSchin 440da2e3ebdSchinx='-(-")"-)-' 441da2e3ebdSchin[[ ${x/*%(()Q\")*/\1} == '(-")"-)' ]] || err_exit $M 442da2e3ebdSchinx='-(-\")"-)-' 443da2e3ebdSchin[[ ${x/*%(()Q\")*/\1} == '(-\")"-)' ]] || err_exit $M 444da2e3ebdSchinx='-(-\")\"-)-' 445da2e3ebdSchin[[ ${x/*%(()Q\")*/\1} == '(-\")\"-)' ]] || err_exit $M 446da2e3ebdSchinx=$'-(-\\\'")\\\'-)-' 447da2e3ebdSchin[[ ${x/*%(()Q\'Q\")*/\1} == $'(-\\\'")\\\'-)' ]] || err_exit $M 448da2e3ebdSchinx=$'-(-\\\'")"-)-' 449da2e3ebdSchin[[ ${x/*%(()Q\'Q\")*/\1} == $'-(-\\\'")"-)-' ]] || err_exit $M 450da2e3ebdSchinx=$'-(-\\\'")"\'-)-' 451da2e3ebdSchin[[ ${x/*%(()Q\'Q\")*/\1} == $'(-\\\'")"\'-)' ]] || err_exit $M 452da2e3ebdSchinx=$'-(-\\"\')\'\\"-)-' 453da2e3ebdSchin[[ ${x/*%(()Q\'Q\")*/\1} == $'(-\\"\')\'\\"-)' ]] || err_exit $M 454da2e3ebdSchinx=$'-(-\')\\\'\'-)-' 455da2e3ebdSchin[[ ${x/*%(()Q\'Q\")*/\1} == $'-(-\')\\\'\'-)-' ]] || err_exit $M 456da2e3ebdSchinx=$'-(-\'")\'-)-' 457da2e3ebdSchin[[ ${x/*%(()L\'Q\")*/\1} == $'(-\'")\'-)' ]] || err_exit $M 458da2e3ebdSchinx=$'-(-\\\'")"-)-' 459da2e3ebdSchin[[ ${x/*%(()L\'Q\")*/\1} == $'-(-\\\'")"-)-' ]] || err_exit $M 460da2e3ebdSchinx=$'-(-\\\'")"\'-)-' 461da2e3ebdSchin[[ ${x/*%(()L\'Q\")*/\1} == $'(-\\\'")"\'-)' ]] || err_exit $M 462da2e3ebdSchinx=$'-(-\\"\')\'\\"-)-' 463da2e3ebdSchin[[ ${x/*%(()L\'Q\")*/\1} == $'(-\\"\')\'\\"-)' ]] || err_exit $M 464da2e3ebdSchinx=$'-(-\')\\\'\'-)-' 465da2e3ebdSchin[[ ${x/*%(()L\'Q\")*/\1} == $'-(-\')\\\'\'-)-' ]] || err_exit $M 466da2e3ebdSchinx='-(-")"-)-' 467da2e3ebdSchin[[ ${x/*%(()Q\")*/\1} == '(-")"-)' ]] || err_exit $M 468da2e3ebdSchinx='-(-\")"-)-' 469da2e3ebdSchin[[ ${x/*%(()Q\")*/\1} == '(-\")"-)' ]] || err_exit $M 470da2e3ebdSchinx='-(-\")\"-)-' 471da2e3ebdSchin[[ ${x/*%(()Q\")*/\1} == '(-\")\"-)' ]] || err_exit $M 472da2e3ebdSchin 473da2e3ebdSchinx='-(-\)-)-' 474da2e3ebdSchin[[ ${x/*%(()E\\)*/\1} == '(-\)-)' ]] || err_exit $M 475da2e3ebdSchinx='-(-\\)-)-' 476da2e3ebdSchin[[ ${x/*%(()E\\)*/\1} == '(-\\)' ]] || err_exit $M 477da2e3ebdSchinx='-(-\")"-)-' 478da2e3ebdSchin[[ ${x/*%(()E\\Q\")*/\1} == '(-\")' ]] || err_exit $M 479da2e3ebdSchinx='-(-\")\"-)-' 480da2e3ebdSchin[[ ${x/*%(()E\\Q\")*/\1} == '(-\")' ]] || err_exit $M 481da2e3ebdSchinx=$'-(-\'")"-)-' 482da2e3ebdSchin[[ ${x/*%(()E\\Q\'Q\")*/\1} == $'-(-\'")"-)-' ]] || err_exit $M 483da2e3ebdSchinx=$'-(-\\\'")"-)-' 484da2e3ebdSchin[[ ${x/*%(()E\\Q\'Q\")*/\1} == $'(-\\\'")"-)' ]] || err_exit $M 485da2e3ebdSchinx=$'-(-\\"\')\'\\"-)-' 486da2e3ebdSchin[[ ${x/*%(()E\\Q\'Q\")*/\1} == $'(-\\"\')\'\\"-)' ]] || err_exit $M 487da2e3ebdSchinx=$'-(-\\\'")"-)-' 488da2e3ebdSchin[[ ${x/*%(()E\\L\'Q\")*/\1} == $'(-\\\'")"-)' ]] || err_exit $M 489da2e3ebdSchinx=$'-(-\\"\')\'\\"-)-' 490da2e3ebdSchin[[ ${x/*%(()E\\L\'Q\")*/\1} == $'(-\\"\')\'\\"-)' ]] || err_exit $M 491da2e3ebdSchinx=$'-(-\\"\')\\\'\\"-)-' 492da2e3ebdSchin[[ ${x/*%(()E\\L\'Q\")*/\1} == $'(-\\"\')\\\'\\"-)' ]] || err_exit $M 493da2e3ebdSchinx=$'-(-\\"\')\\\'\\"\'-)-' 494da2e3ebdSchin[[ ${x/*%(()E\\L\'Q\")*/\1} == $'-(-\\"\')\\\'\\"\'-)-' ]] || err_exit $M 495da2e3ebdSchin 496da2e3ebdSchinpattern=00 497da2e3ebdSchinvar=100 498da2e3ebdSchin[[ $( print $(( ${var%%00} )) ) == 1 ]] || err_exit "arithmetic with embeddded patterns fails" 499da2e3ebdSchin[[ $( print $(( ${var%%$pattern} )) ) == 1 ]] || err_exit "arithmetic with embeddded pattern variables fails" 50034f9b3eeSRoland Mainzif [[ ax == @(a)* ]] && [[ ${.sh.match[1]:0:${#.sh.match[1]}} != a ]] 501da2e3ebdSchinthen err_exit '${.sh.match[1]:1:${#.sh.match[1]}} not expanding correctly' 502da2e3ebdSchinfi 503da2e3ebdSchin 504da2e3ebdSchinstring='foo(d:\nt\box\something)bar' 505da2e3ebdSchinexpected='d:\nt\box\something' 506da2e3ebdSchin[[ ${string/*\(+([!\)])\)*/\1} == "$expected" ]] || err_exit "substring expansion failed '${string/*\(+([!\)])\)*/\1}' returned -- '$expected' expected" 507*b30d1939SAndy Fiddamanif [[ $($SHELL -c $'export LC_ALL=C.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 ]] 508*b30d1939SAndy Fiddamanthen LC_ALL=C.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' 509da2e3ebdSchinfi 51034f9b3eeSRoland Mainz{ $SHELL -c 'unset x;[[ ${SHELL:$x} == $SHELL ]]';} 2> /dev/null || err_exit '${var:$x} fails when x is not set' 51134f9b3eeSRoland Mainz{ $SHELL -c 'x=;[[ ${SHELL:$x} == $SHELL ]]';} 2> /dev/null || err_exit '${var:$x} fails when x is null' 5127c2fbfb3SApril Chin 5137c2fbfb3SApril Chin# subject mode pattern result # 5147c2fbfb3SApril Chinset -- \ 5157c2fbfb3SApril Chin 'a$z' 'E' '[$]|#' 'a($)z' \ 5167c2fbfb3SApril Chin 'a#z' 'E' '[$]|#' 'a(#)z' \ 5177c2fbfb3SApril Chin 'a$z' 'Elr' '[$]|#' 'a$z' \ 5187c2fbfb3SApril Chin 'a#z' 'Elr' '[$]|#' 'a#z' \ 5197c2fbfb3SApril Chin 'a$' 'E' '[$]|#' 'a($)' \ 5207c2fbfb3SApril Chin 'a#' 'E' '[$]|#' 'a(#)' \ 5217c2fbfb3SApril Chin 'a$' 'Elr' '[$]|#' 'a$' \ 5227c2fbfb3SApril Chin 'a#' 'Elr' '[$]|#' 'a#' \ 5237c2fbfb3SApril Chin '$z' 'E' '[$]|#' '($)z' \ 5247c2fbfb3SApril Chin '#z' 'E' '[$]|#' '(#)z' \ 5257c2fbfb3SApril Chin '$z' 'Elr' '[$]|#' '$z' \ 5267c2fbfb3SApril Chin '#z' 'Elr' '[$]|#' '#z' \ 5277c2fbfb3SApril Chin '$' 'E' '[$]|#' '($)' \ 5287c2fbfb3SApril Chin '#' 'E' '[$]|#' '(#)' \ 5297c2fbfb3SApril Chin '$' 'Elr' '[$]|#' '($)' \ 5307c2fbfb3SApril Chin '#' 'Elr' '[$]|#' '(#)' \ 5317c2fbfb3SApril Chin 'a$z' 'E' '\$|#' 'a$z()' \ 5327c2fbfb3SApril Chin 'a$z' 'E' '\\$|#' 'a$z' \ 5337c2fbfb3SApril Chin 'a$z' 'E' '\\\$|#' 'a($)z' \ 5347c2fbfb3SApril Chin 'a#z' 'E' '\\\$|#' 'a(#)z' \ 5357c2fbfb3SApril Chin 'a$z' 'Elr' '\\\$|#' 'a$z' \ 5367c2fbfb3SApril Chin 'a#z' 'Elr' '\\\$|#' 'a#z' \ 5377c2fbfb3SApril Chin 'a$' 'E' '\\\$|#' 'a($)' \ 5387c2fbfb3SApril Chin 'a#' 'E' '\\\$|#' 'a(#)' \ 5397c2fbfb3SApril Chin 'a$' 'Elr' '\\\$|#' 'a$' \ 5407c2fbfb3SApril Chin 'a#' 'Elr' '\\\$|#' 'a#' \ 5417c2fbfb3SApril Chin '$z' 'E' '\\\$|#' '($)z' \ 5427c2fbfb3SApril Chin '#z' 'E' '\\\$|#' '(#)z' \ 5437c2fbfb3SApril Chin '$z' 'Elr' '\\\$|#' '$z' \ 5447c2fbfb3SApril Chin '#z' 'Elr' '\\\$|#' '#z' \ 5457c2fbfb3SApril Chin '$' 'E' '\\\$|#' '($)' \ 5467c2fbfb3SApril Chin '#' 'E' '\\\$|#' '(#)' \ 5477c2fbfb3SApril Chin '$' 'Elr' '\\\$|#' '($)' \ 5487c2fbfb3SApril Chin '#' 'Elr' '\\\$|#' '(#)' \ 5497c2fbfb3SApril Chin# do not delete this line # 5507c2fbfb3SApril Chinunset i o 5517c2fbfb3SApril Chinwhile (( $# >= 4 )) 5527c2fbfb3SApril Chindo i=$1 5537c2fbfb3SApril Chin eval o="\${i/~($2)$3/\\(\\0\\)}" 5547c2fbfb3SApril Chin if [[ "$o" != "$4" ]] 5557c2fbfb3SApril Chin then err_exit "i='$1'; \${i/~($2)$3/\\(\\0\\)} failed -- expected '$4', got '$o'" 5567c2fbfb3SApril Chin fi 5577c2fbfb3SApril Chin eval o="\${i/~($2)($3)/\\(\\1\\)}" 5587c2fbfb3SApril Chin if [[ "$o" != "$4" ]] 5597c2fbfb3SApril Chin then err_exit "i='$1'; \${i/~($2)($3)/\\(\\1\\)} failed -- expected '$4', got '$o'" 5607c2fbfb3SApril Chin fi 5617c2fbfb3SApril Chin shift 4 5627c2fbfb3SApril Chindone 5637c2fbfb3SApril Chin 564*b30d1939SAndy Fiddaman#multibyte locale tests 565*b30d1939SAndy Fiddamanx='a<2b|>c<3d|\>e' LC_ALL=debug $SHELL -c 'test "${x:0:1}" == a || err_exit ${x:0:1} should be a' 566*b30d1939SAndy Fiddamanx='a<2b|>c<3d|\>e' LC_ALL=debug $SHELL -c 'test "${x:1:1}" == "<2b|>" || err_exit ${x:1:1} should be <2b|>' 567*b30d1939SAndy Fiddamanx='a<2b|>c<3d|\>e' LC_ALL=debug $SHELL -c 'test "${x:3:1}" == "<3d|\\>" || err_exit ${x:3:1} should be <3d|\>' 568*b30d1939SAndy Fiddamanx='a<2b|>c<3d|\>e' LC_ALL=debug $SHELL -c 'test "${x:4:1}" == e || err_exit ${x:4:1} should bee' 569*b30d1939SAndy Fiddamanx='a<2b|>c<3d|\>e' LC_ALL=debug $SHELL -c 'test "${x:1}" == "<2b|>c<3d|\\>e" || print -u2 ${x:1}" should be <2b|>c<3d|\>e' 570*b30d1939SAndy Fiddamanx='a<2b|>c<3d|\>e' LC_ALL=debug $SHELL -c 'test "${x: -1:1}" == e || err_exit ${x: -1:1} should be e' 571*b30d1939SAndy Fiddamanx='a<2b|>c<3d|\>e' LC_ALL=debug $SHELL -c 'test "${x: -2:1}" == "<3d|\\>" || err_exit ${x: -2:1} == <3d|\>' 572*b30d1939SAndy Fiddamanx='a<2b|>c<3d|\>e' LC_ALL=debug $SHELL -c 'test "${x:1:3}" == "<2b|>c<3d|\\>" || err_exit ${x:1:3} should be <2b|>c<3d|\>' 573*b30d1939SAndy Fiddamanx='a<2b|>c<3d|\>e' LC_ALL=debug $SHELL -c 'test "${x:1:20}" == "<2b|>c<3d|\\>e" || err_exit ${x:1:20} should be <2b|>c<3d|\>e' 574*b30d1939SAndy Fiddamanx='a<2b|>c<3d|\>e' LC_ALL=debug $SHELL -c 'test "${x#??}" == "c<3d|\\>e" || err_exit "${x#??} should be c<3d|\>e' 575*b30d1939SAndy Fiddaman 576*b30d1939SAndy Fiddamanx='a one and a two' 577*b30d1939SAndy Fiddaman[[ "${x//~(E)\<.\>/}" == ' one and two' ]] || err_exit "\< and \> not working in with ere's" 578*b30d1939SAndy Fiddaman 579*b30d1939SAndy Fiddaman{ 580*b30d1939SAndy Fiddaman$SHELL -c 'typeset x="123" ; integer i=100 ; print -n "${x:i:5}"' 581*b30d1939SAndy Fiddaman} 2> /dev/null || err_exit '${x:i:j} fails when i > strlen(x)' 582*b30d1939SAndy Fiddaman 583*b30d1939SAndy Fiddamangot=$($SHELL -c 'A=""; B="B"; for I in ${A[@]} ${B[@]}; do echo "\"$I\""; done') 584*b30d1939SAndy Fiddaman[[ $got == $'"B"' ]] || err_exit '"\"$I\"" fails when $I is empty string' 585*b30d1939SAndy Fiddaman 586*b30d1939SAndy FiddamanA='|' 587*b30d1939SAndy Fiddaman[[ $A == $A ]] || err_exit 'With A="|", [[ $A == $A ]] does not match' 588*b30d1939SAndy Fiddaman 589*b30d1939SAndy Fiddamanx="111 222 333 444 555 666" 590*b30d1939SAndy Fiddaman[[ $x == ~(E)(...).(...).(...) ]] 591*b30d1939SAndy Fiddaman[[ -v .sh.match[0] ]] || err_exit '[[ -v .sh.match[0] ]] should be true' 592*b30d1939SAndy Fiddaman[[ -v .sh.match[3] ]] || err_exit '[[ -v .sh.match[3] ]] should be true' 593*b30d1939SAndy Fiddaman[[ -v .sh.match[4] ]] && err_exit '[[ -v .sh.match[4] ]] should be false' 594*b30d1939SAndy Fiddaman[[ ${#.sh.match[@]} == 4 ]] || err_exit "\${#.sh.match[@]} should be 4, not ${#.sh.match[@]}" 595*b30d1939SAndy Fiddaman 596*b30d1939SAndy Fiddamanx="foo bar" 597*b30d1939SAndy Fiddamandummy=${x/~(E)(*)/} 598*b30d1939SAndy Fiddaman[[ ${ print -v .sh.match;} ]] && err_exit 'print -v should show .sh.match empty when there are no matches' 599*b30d1939SAndy Fiddaman 600*b30d1939SAndy Fiddamanif $SHELL -c 'set 1 2 3 4 5 6 7 8 9 10 11 12; : ${##[0-9]}' 2>/dev/null 601*b30d1939SAndy Fiddamanthen set 1 2 3 4 5 6 7 8 9 10 11 12 602*b30d1939SAndy Fiddaman [[ ${##[0-9]} == 2 ]] || err_exit '${##[0-9]} should be 2 with $#==12' 603*b30d1939SAndy Fiddaman [[ ${###[0-9]} == 2 ]] || err_exit '${###[0-9]} should be 2 with $#==12' 604*b30d1939SAndy Fiddaman [[ ${#%[0-9]} == 1 ]] || err_exit '${#%[0-9]} should be 1 with $#==12' 605*b30d1939SAndy Fiddaman [[ ${#%%[0-9]} == 1 ]] || err_exit '${#%%[0-9]} should be 1 with $#==12' 606*b30d1939SAndy Fiddamanelse err_exit '${##[0-9]} give syntax error' 607*b30d1939SAndy Fiddamanfi 608*b30d1939SAndy Fiddaman 609*b30d1939SAndy Fiddaman{ 610*b30d1939SAndy Fiddaman $SHELL -c 'x="a123 456 789z"; : ${x//{3}(\d)/ }' & 611*b30d1939SAndy Fiddaman sleep .5; kill $!; wait $! 612*b30d1939SAndy Fiddaman} 2> /dev/null || err_exit $'tokenizer can\'t handle ${var op {..} }' 613*b30d1939SAndy Fiddaman 614*b30d1939SAndy Fiddaman 615*b30d1939SAndy Fiddamanfunction foo 616*b30d1939SAndy Fiddaman{ 617*b30d1939SAndy Fiddaman typeset x="123 456 789 abc" 618*b30d1939SAndy Fiddaman typeset dummy="${x/~(E-g)([[:digit:]][[:digit:]])((X)|([[:digit:]]))([[:blank:]])/_}" 619*b30d1939SAndy Fiddaman exp=$'(\n\t[0]=\'123 \'\n\t[1]=12\n\t[2]=3\n\t[4]=3\n\t[5]=\' \'\n)' 620*b30d1939SAndy Fiddaman [[ $(print -v .sh.match) == "$exp" ]] || err_exit '.sh.match not correct with alternations' 621*b30d1939SAndy Fiddaman} 622*b30d1939SAndy Fiddamanfoo 623*b30d1939SAndy Fiddaman 624*b30d1939SAndy Fiddamanx="a 1 b" 625*b30d1939SAndy Fiddamand=${x/~(E)(([[:digit:]])[[:space:]]*|([[:alpha:]]))/X} 626*b30d1939SAndy Fiddaman[[ $(print -v .sh.match) == $'(\n\t[0]=a\n\t[1]=a\n\t[3]=a\n)' ]] || err_exit '.sh.match not sparse' 627*b30d1939SAndy Fiddaman 628*b30d1939SAndy Fiddamanunset v 629*b30d1939SAndy Fiddamantypeset -a arr=( 0 1 2 3 4 ) 630*b30d1939SAndy Fiddamanfor v in "${arr[@]:5}" 631*b30d1939SAndy Fiddamando err_exit "\${arr[@]:5} should not generate $v" 632*b30d1939SAndy Fiddaman break 633*b30d1939SAndy Fiddamandone 634*b30d1939SAndy Fiddamanfor v in "${arr[@]:1:0}" 635*b30d1939SAndy Fiddamando err_exit "\${arr[@]:1:0} should not generate ${v:-empty_string}" 636*b30d1939SAndy Fiddaman break 637*b30d1939SAndy Fiddamandone 638*b30d1939SAndy Fiddamanfor v in "${arr[@]:0:-1}" 639*b30d1939SAndy Fiddamando err_exit "\${arr[@]:0:-1} should not generate ${v:-empty_string}" 640*b30d1939SAndy Fiddaman break 641*b30d1939SAndy Fiddamandone 642*b30d1939SAndy Fiddaman 643*b30d1939SAndy Fiddamanset 1 2 3 4 644*b30d1939SAndy Fiddamanfor v in "${@:5}" 645*b30d1939SAndy Fiddamando err_exit "\${@:5} should not generate $v" 646*b30d1939SAndy Fiddaman break 647*b30d1939SAndy Fiddamandone 648*b30d1939SAndy Fiddamanfor v in "${@:1:0}" 649*b30d1939SAndy Fiddamando err_exit "\${@:1:0} should not generate ${v:-empty_string}" 650*b30d1939SAndy Fiddaman break 651*b30d1939SAndy Fiddamandone 652*b30d1939SAndy Fiddamanfor v in "${@:0:-1}" 653*b30d1939SAndy Fiddamando err_exit "\${@:0:-1} should not generate ${v:-empty_string}" 654*b30d1939SAndy Fiddaman break 655*b30d1939SAndy Fiddamandone 656*b30d1939SAndy Fiddaman 657*b30d1939SAndy Fiddamanunset v d 658*b30d1939SAndy Fiddamanv=abbbc 659*b30d1939SAndy Fiddamand="${v/~(E)b{2,4}/dummy}" 660*b30d1939SAndy Fiddaman[[ ${.sh.match} == bbb ]] || err_exit '.sh.match wrong after ${s/~(E)b{2,4}/dummy}' 661*b30d1939SAndy Fiddaman[[ $d == adummyc ]] || err_exit '${s/~(E)b{2,4}/dummy} not working' 662*b30d1939SAndy Fiddaman 663*b30d1939SAndy Fiddaman 664*b30d1939SAndy Fiddamanexit $((Errors<125?Errors:125)) 665