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 2834f9b3eeSRoland MainzCommand=${0##*/} 2934f9b3eeSRoland Mainzinteger Errors=0 3034f9b3eeSRoland Mainz 3134f9b3eeSRoland Mainztmp=$(mktemp -dt) || { err_exit mktemp -dt failed; exit 1; } 3234f9b3eeSRoland Mainztrap "cd /; rm -rf $tmp" EXIT 3334f9b3eeSRoland Mainz 34da2e3ebdSchinfunction fun 35da2e3ebdSchin{ 36da2e3ebdSchin integer i 37da2e3ebdSchin unset xxx 38da2e3ebdSchin for i in 0 1 39da2e3ebdSchin do xxx[$i]=$i 40da2e3ebdSchin done 41da2e3ebdSchin} 42da2e3ebdSchin 43da2e3ebdSchinset -A x zero one two three four 'five six' 44da2e3ebdSchinif [[ $x != zero ]] 45da2e3ebdSchinthen err_exit '$x is not element 0' 46da2e3ebdSchinfi 47da2e3ebdSchinif [[ ${x[0]} != zero ]] 48da2e3ebdSchinthen err_exit '${x[0] is not element 0' 49da2e3ebdSchinfi 50da2e3ebdSchinif (( ${#x[0]} != 4 )) 51da2e3ebdSchinthen err_exit "length of ${x[0]} is not 4" 52da2e3ebdSchinfi 53da2e3ebdSchinif (( ${#x[@]} != 6 )) 54da2e3ebdSchinthen err_exit 'number of elements of x is not 6' 55da2e3ebdSchinfi 56da2e3ebdSchinif [[ ${x[2]} != two ]] 57da2e3ebdSchinthen err_exit ' element two is not 2' 58da2e3ebdSchinfi 59da2e3ebdSchinif [[ ${x[@]:2:1} != two ]] 60da2e3ebdSchinthen err_exit ' ${x[@]:2:1} is not two' 61da2e3ebdSchinfi 62da2e3ebdSchinset -A y -- ${x[*]} 63da2e3ebdSchinif [[ $y != zero ]] 64da2e3ebdSchinthen err_exit '$x is not element 0' 65da2e3ebdSchinfi 66da2e3ebdSchinif [[ ${y[0]} != zero ]] 67da2e3ebdSchinthen err_exit '${y[0] is not element 0' 68da2e3ebdSchinfi 69da2e3ebdSchinif (( ${#y[@]} != 7 )) 70da2e3ebdSchinthen err_exit 'number of elements of y is not 7' 71da2e3ebdSchinfi 72da2e3ebdSchinif [[ ${y[2]} != two ]] 73da2e3ebdSchinthen err_exit ' element two is not 2' 74da2e3ebdSchinfi 75da2e3ebdSchinset +A y nine ten 76da2e3ebdSchinif [[ ${y[2]} != two ]] 77da2e3ebdSchinthen err_exit ' element two is not 2' 78da2e3ebdSchinfi 79da2e3ebdSchinif [[ ${y[0]} != nine ]] 80da2e3ebdSchinthen err_exit '${y[0] is not nine' 81da2e3ebdSchinfi 82da2e3ebdSchinunset y[4] 83da2e3ebdSchinif (( ${#y[@]} != 6 )) 84da2e3ebdSchinthen err_exit 'number of elements of y is not 6' 85da2e3ebdSchinfi 86da2e3ebdSchinif (( ${#y[4]} != 0 )) 87da2e3ebdSchinthen err_exit 'string length of unset element is not 0' 88da2e3ebdSchinfi 89da2e3ebdSchinunset foo 90da2e3ebdSchinif (( ${#foo[@]} != 0 )) 91da2e3ebdSchinthen err_exit 'number of elements of unset variable foo is not 0' 92da2e3ebdSchinfi 93da2e3ebdSchinfoo='' 94da2e3ebdSchinif (( ${#foo[0]} != 0 )) 95da2e3ebdSchinthen err_exit 'string length of null element is not 0' 96da2e3ebdSchinfi 97da2e3ebdSchinif (( ${#foo[@]} != 1 )) 98da2e3ebdSchinthen err_exit 'number of elements of null variable foo is not 1' 99da2e3ebdSchinfi 100da2e3ebdSchinunset foo 101da2e3ebdSchinfoo[0]=foo 102da2e3ebdSchinfoo[3]=bar 103da2e3ebdSchinunset foo[0] 104da2e3ebdSchinunset foo[3] 105da2e3ebdSchinif (( ${#foo[@]} != 0 )) 106da2e3ebdSchinthen err_exit 'number of elements of left in variable foo is not 0' 107da2e3ebdSchinfi 108da2e3ebdSchinunset foo 109da2e3ebdSchinfoo[3]=bar 110da2e3ebdSchinfoo[0]=foo 111da2e3ebdSchinunset foo[3] 112da2e3ebdSchinunset foo[0] 113da2e3ebdSchinif (( ${#foo[@]} != 0 )) 114da2e3ebdSchinthen err_exit 'number of elements of left in variable foo again is not 0' 115da2e3ebdSchinfi 116da2e3ebdSchinfun 117da2e3ebdSchinif (( ${#xxx[@]} != 2 )) 118da2e3ebdSchinthen err_exit 'number of elements of left in variable xxx is not 2' 119da2e3ebdSchinfi 120da2e3ebdSchinfun 121da2e3ebdSchinif (( ${#xxx[@]} != 2 )) 122da2e3ebdSchinthen err_exit 'number of elements of left in variable xxx again is not 2' 123da2e3ebdSchinfi 124da2e3ebdSchinset -A foo -- "${x[@]}" 125da2e3ebdSchinif (( ${#foo[@]} != 6 )) 126da2e3ebdSchinthen err_exit 'number of elements of foo is not 6' 127da2e3ebdSchinfi 128da2e3ebdSchinif (( ${#PWD[@]} != 1 )) 129da2e3ebdSchinthen err_exit 'number of elements of PWD is not 1' 130da2e3ebdSchinfi 131da2e3ebdSchinunset x 132da2e3ebdSchinx[2]=foo x[4]=bar 133da2e3ebdSchinif (( ${#x[@]} != 2 )) 134da2e3ebdSchinthen err_exit 'number of elements of x is not 2' 135da2e3ebdSchinfi 136da2e3ebdSchins[1]=1 c[1]=foo 137da2e3ebdSchinif [[ ${c[s[1]]} != foo ]] 138da2e3ebdSchinthen err_exit 'c[1]=foo s[1]=1; ${c[s[1]]} != foo' 139da2e3ebdSchinfi 140da2e3ebdSchinunset s 141da2e3ebdSchintypeset -Ai s 142da2e3ebdSchiny=* z=[ 143da2e3ebdSchins[$y]=1 144da2e3ebdSchins[$z]=2 145da2e3ebdSchinif (( ${#s[@]} != 2 )) 146da2e3ebdSchinthen err_exit 'number of elements of is not 2' 147da2e3ebdSchinfi 148da2e3ebdSchin(( s[$z] = s[$z] + ${s[$y]} )) 149da2e3ebdSchinif [[ ${s[$z]} != 3 ]] 150da2e3ebdSchinthen err_exit '[[ ${s[$z]} != 3 ]]' 151da2e3ebdSchinfi 152da2e3ebdSchinif (( s[$z] != 3 )) 153da2e3ebdSchinthen err_exit '(( s[$z] != 3 ))' 154da2e3ebdSchinfi 155da2e3ebdSchin(( s[$y] = s[$y] + ${s[$z]} )) 156da2e3ebdSchinif [[ ${s[$y]} != 4 ]] 157da2e3ebdSchinthen err_exit '[[ ${s[$y]} != 4 ]]' 158da2e3ebdSchinfi 159da2e3ebdSchinif (( s[$y] != 4 )) 160da2e3ebdSchinthen err_exit '(( s[$y] != 4 ))' 161da2e3ebdSchinfi 162da2e3ebdSchinset -A y 2 4 6 163da2e3ebdSchintypeset -i y 164da2e3ebdSchinz=${y[@]} 165da2e3ebdSchintypeset -R12 y 166da2e3ebdSchintypeset -i y 167da2e3ebdSchinif [[ ${y[@]} != "$z" ]] 168da2e3ebdSchinthen err_exit 'error in array conversion from int to R12' 169da2e3ebdSchinfi 170da2e3ebdSchinif (( ${#y[@]} != 3 )) 171da2e3ebdSchinthen err_exit 'error in count of array conversion from int to R12' 172da2e3ebdSchinfi 173da2e3ebdSchinunset abcdefg 174da2e3ebdSchin: ${abcdefg[1]} 175da2e3ebdSchinset | grep '^abcdefg$' >/dev/null && err_exit 'empty array variable in set list' 176da2e3ebdSchinunset x y 177da2e3ebdSchinx=1 178da2e3ebdSchintypeset -i y[$x]=4 179da2e3ebdSchinif [[ ${y[1]} != 4 ]] 180da2e3ebdSchinthen err_exit 'arithmetic expressions in typeset not working' 181da2e3ebdSchinfi 182da2e3ebdSchinunset foo 183da2e3ebdSchintypeset foo=bar 184da2e3ebdSchintypeset -A foo 185da2e3ebdSchinif [[ ${foo[0]} != bar ]] 186da2e3ebdSchinthen err_exit 'initial value not preserved when typecast to associative' 187da2e3ebdSchinfi 188da2e3ebdSchinunset foo 189da2e3ebdSchinfoo=(one two) 190da2e3ebdSchintypeset -A foo 191da2e3ebdSchinfoo[two]=3 192da2e3ebdSchinif [[ ${#foo[*]} != 3 ]] 193da2e3ebdSchinthen err_exit 'conversion of indexed to associative array failed' 194da2e3ebdSchinfi 195da2e3ebdSchinset a b c d e f g h i j k l m 196da2e3ebdSchinif [[ ${#} != 13 ]] 197da2e3ebdSchinthen err_exit '${#} not 13' 198da2e3ebdSchinfi 199da2e3ebdSchinunset xxx 200da2e3ebdSchinxxx=foo 201da2e3ebdSchinif [[ ${!xxx[@]} != 0 ]] 202da2e3ebdSchinthen err_exit '${!xxx[@]} for scalar not 0' 203da2e3ebdSchinfi 204da2e3ebdSchinif [[ ${11} != k ]] 205da2e3ebdSchinthen err_exit '${11} not working' 206da2e3ebdSchinfi 207da2e3ebdSchinif [[ ${@:4:1} != d ]] 208da2e3ebdSchinthen err_exit '${@:4:1} not working' 209da2e3ebdSchinfi 210da2e3ebdSchinfoovar1=abc 211da2e3ebdSchinfoovar2=def 212da2e3ebdSchinif [[ ${!foovar@} != +(foovar[[:alnum:]]?([ ])) ]] 213da2e3ebdSchinthen err_exit '${!foovar@} does not expand correctly' 214da2e3ebdSchinfi 215da2e3ebdSchinif [[ ${!foovar1} != foovar1 ]] 216da2e3ebdSchinthen err_exit '${!foovar1} != foovar1' 217da2e3ebdSchinfi 218da2e3ebdSchinunset xxx 219da2e3ebdSchin: ${xxx[3]} 220da2e3ebdSchinif [[ ${!xxx[@]} ]] 221da2e3ebdSchinthen err_exit '${!xxx[@]} should be null' 222da2e3ebdSchinfi 223da2e3ebdSchininteger i=0 224da2e3ebdSchin{ 225da2e3ebdSchin set -x 226da2e3ebdSchin xxx[++i]=1 227da2e3ebdSchin set +x 228da2e3ebdSchin} 2> /dev/null 229da2e3ebdSchinif (( i != 1)) 230da2e3ebdSchinthen err_exit 'execution trace side effects with array subscripts' 231da2e3ebdSchinfi 232da2e3ebdSchinunset list 233da2e3ebdSchin: $(set -A list foo bar) 234da2e3ebdSchinif (( ${#list[@]} != 0)) 235da2e3ebdSchinthen err_exit '$(set -A list ...) leaves side effects' 236da2e3ebdSchinfi 237da2e3ebdSchinunset list 238da2e3ebdSchinlist= (foo bar bam) 239da2e3ebdSchin( set -A list one two three four) 240da2e3ebdSchinif [[ ${list[1]} != bar ]] 241da2e3ebdSchinthen err_exit 'array not restored after subshell' 242da2e3ebdSchinfi 243da2e3ebdSchinXPATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:.:/sbin:/usr/sbin 244da2e3ebdSchinxpath=( $( IFS=: ; echo $XPATH ) ) 245da2e3ebdSchinif [[ $(print -r "${xpath[@]##*/}") != 'bin bin ucb bin . sbin sbin' ]] 246da2e3ebdSchinthen err_exit '${xpath[@]##*/} not applied to each element' 247da2e3ebdSchinfi 248da2e3ebdSchinfoo=( zero one '' three four '' six) 249da2e3ebdSchininteger n=-1 250da2e3ebdSchinif [[ ${foo[@]:n} != six ]] 251da2e3ebdSchinthen err_exit 'array offset of -1 not working' 252da2e3ebdSchinfi 253da2e3ebdSchinif [[ ${foo[@]: -3:1} != four ]] 254da2e3ebdSchinthen err_exit 'array offset of -3:1 not working' 255da2e3ebdSchinfi 256da2e3ebdSchin$SHELL -c 'x=(if then else fi)' 2> /dev/null || err_exit 'reserved words in x=() assignment not working' 257da2e3ebdSchinunset foo 258da2e3ebdSchinfoo=one 259da2e3ebdSchinfoo=( $foo two) 260da2e3ebdSchinif [[ ${#foo[@]} != 2 ]] 261da2e3ebdSchinthen err_exit 'array getting unset before right hand side evaluation' 262da2e3ebdSchinfi 263da2e3ebdSchinfoo=(143 3643 38732) 264da2e3ebdSchinexport foo 265da2e3ebdSchintypeset -i foo 266da2e3ebdSchinif [[ $($SHELL -c 'print $foo') != 143 ]] 267da2e3ebdSchinthen err_exit 'exporting indexed array not exporting 0-th element' 268da2e3ebdSchinfi 269da2e3ebdSchin( $SHELL -c ' 270da2e3ebdSchin unset foo 271da2e3ebdSchin typeset -A foo=([0]=143 [1]=3643 [2]=38732) 272da2e3ebdSchin export foo 273da2e3ebdSchin typeset -i foo 274da2e3ebdSchin [[ $($SHELL -c "print $foo") == 143 ]]' 275da2e3ebdSchin) 2> /dev/null || 276da2e3ebdSchin err_exit 'exporting associative array not exporting 0-th element' 277da2e3ebdSchinunset foo 278da2e3ebdSchintypeset -A foo 279da2e3ebdSchinfoo[$((10))]=ok 2> /dev/null || err_exit 'arithmetic expression as subscript not working' 280da2e3ebdSchinunset foo 281da2e3ebdSchintypeset -A foo 282da2e3ebdSchininteger foo=0 283da2e3ebdSchin[[ $foo == 0 ]] || err_exit 'zero element of associative array not being set' 284da2e3ebdSchinunset foo 285da2e3ebdSchintypeset -A foo=( [two]=1) 286da2e3ebdSchinfor i in one three four five 287da2e3ebdSchindo : ${foo[$i]} 288da2e3ebdSchindone 289da2e3ebdSchinif [[ ${!foo[@]} != two ]] 29034f9b3eeSRoland Mainzthen err_exit 'error in subscript names' 291da2e3ebdSchinfi 292da2e3ebdSchinunset x 293da2e3ebdSchinx=( 1 2 3) 294da2e3ebdSchin(x[1]=8) 295da2e3ebdSchin[[ ${x[1]} == 2 ]] || err_exit 'index array produce side effects in subshells' 296da2e3ebdSchinx=( 1 2 3) 297da2e3ebdSchin( 298da2e3ebdSchin x+=(8) 299da2e3ebdSchin [[ ${#x[@]} == 4 ]] || err_exit 'index array append in subshell error' 300da2e3ebdSchin) 301da2e3ebdSchin[[ ${#x[@]} == 3 ]] || err_exit 'index array append in subshell effects parent' 302da2e3ebdSchinx=( [one]=1 [two]=2 [three]=3) 303da2e3ebdSchin(x[two]=8) 304da2e3ebdSchin[[ ${x[two]} == 2 ]] || err_exit 'associative array produce side effects in subshells' 305da2e3ebdSchinunset x 306da2e3ebdSchinx=( [one]=1 [two]=2 [three]=3) 307da2e3ebdSchin( 308da2e3ebdSchin x+=( [four]=4 ) 309da2e3ebdSchin [[ ${#x[@]} == 4 ]] || err_exit 'associative array append in subshell error' 310da2e3ebdSchin) 311da2e3ebdSchin[[ ${#x[@]} == 3 ]] || err_exit 'associative array append in subshell effects parent' 312da2e3ebdSchinunset x 313da2e3ebdSchininteger i 314da2e3ebdSchinfor ((i=0; i < 40; i++)) 315da2e3ebdSchindo x[i]=$i 316da2e3ebdSchindone 317da2e3ebdSchin[[ ${#x[@]} == 40 ]] || err_exit 'index arrays loosing values' 318da2e3ebdSchin[[ $( ($SHELL -c 'typeset -A var; (IFS=: ; set -A var a:b:c ;print ${var[@]});:' )2>/dev/null) == 'a b c' ]] || err_exit 'change associative to index failed' 319da2e3ebdSchinunset foo 320da2e3ebdSchin[[ $(foo=good 321da2e3ebdSchinfor ((i=0; i < 2; i++)) 322da2e3ebdSchindo [[ ${foo[i]} ]] && print ok 323da2e3ebdSchindone) == ok ]] || err_exit 'invalid optimization for subscripted variables' 324da2e3ebdSchin( 325da2e3ebdSchinx=([foo]=bar) 326da2e3ebdSchinset +A x bam 327da2e3ebdSchin) 2> /dev/null && err_exit 'set +A with associative array should be an error' 328da2e3ebdSchinunset bam foo 329da2e3ebdSchinfoo=0 330da2e3ebdSchintypeset -A bam 331da2e3ebdSchinunset bam[foo] 332da2e3ebdSchinbam[foo]=value 333da2e3ebdSchin[[ $bam == value ]] && err_exit 'unset associative array element error' 334da2e3ebdSchin: only first element of an array can be exported 335da2e3ebdSchinunset bam 33634f9b3eeSRoland Mainzprint 'print ${var[0]} ${var[1]}' > $tmp/script 33734f9b3eeSRoland Mainzchmod +x $tmp/script 33834f9b3eeSRoland Mainz[[ $($SHELL -c "var=(foo bar);export var;$tmp/script") == foo ]] || err_exit 'export array not exporting just first element' 339*3e14f97fSRoger A. Faulkner 340da2e3ebdSchinunset foo 341*3e14f97fSRoger A. Faulknerset --allexport 342da2e3ebdSchinfoo=one 343da2e3ebdSchinfoo[1]=two 344da2e3ebdSchinfoo[0]=three 345*3e14f97fSRoger A. Faulkner[[ $foo == three ]] || err_exit '--allexport not working with arrays' 346*3e14f97fSRoger A. Faulknerset --noallexport 347*3e14f97fSRoger A. Faulknerunset foo 348*3e14f97fSRoger A. Faulkner 34934f9b3eeSRoland Mainzcat > $tmp/script <<- \! 350da2e3ebdSchin typeset -A foo 351da2e3ebdSchin print foo${foo[abc]} 352da2e3ebdSchin! 35334f9b3eeSRoland Mainz[[ $($SHELL -c "typeset -A foo;$tmp/script") == foo ]] 2> /dev/null || err_exit 'empty associative arrays not being cleared correctly before scripts' 35434f9b3eeSRoland Mainz[[ $($SHELL -c "typeset -A foo;foo[abc]=abc;$tmp/script") == foo ]] 2> /dev/null || err_exit 'associative arrays not being cleared correctly before scripts' 355da2e3ebdSchinunset foo 356da2e3ebdSchinfoo=(one two) 357da2e3ebdSchin[[ ${foo[@]:1} == two ]] || err_exit '${foo[@]:1} == two' 358da2e3ebdSchin[[ ! ${foo[@]:2} ]] || err_exit '${foo[@]:2} not null' 359da2e3ebdSchinunset foo 360da2e3ebdSchinfoo=one 361da2e3ebdSchin[[ ! ${foo[@]:1} ]] || err_exit '${foo[@]:1} not null' 362da2e3ebdSchinfunction EMPTY 363da2e3ebdSchin{ 364da2e3ebdSchin typeset i 365da2e3ebdSchin typeset -n ARRAY=$1 366da2e3ebdSchin for i in ${!ARRAY[@]} 367da2e3ebdSchin do unset ARRAY[$i] 368da2e3ebdSchin done 369da2e3ebdSchin} 370da2e3ebdSchinunset foo 371da2e3ebdSchintypeset -A foo 372da2e3ebdSchinfoo[bar]=bam 373da2e3ebdSchinfoo[x]=y 374da2e3ebdSchinEMPTY foo 375da2e3ebdSchin[[ $(typeset | grep foo$) == *associative* ]] || err_exit 'array lost associative attribute' 376da2e3ebdSchin[[ ! ${foo[@]} ]] || err_exit 'array not empty' 377da2e3ebdSchin[[ ! ${!foo[@]} ]] || err_exit 'array names not empty' 378da2e3ebdSchinunset foo 379da2e3ebdSchinfoo=bar 380da2e3ebdSchinset -- "${foo[@]:1}" 381da2e3ebdSchin(( $# == 0 )) || err_exit '${foo[@]:1} should not have any values' 382da2e3ebdSchinunset bar 383*3e14f97fSRoger A. Faulknerexp=4 384da2e3ebdSchin: ${_foo[bar=4]} 385*3e14f97fSRoger A. Faulkner(( bar == 4 )) || err_exit "subscript of unset variable not evaluated -- expected '4', got '$got'" 386*3e14f97fSRoger A. Faulknerunset bar 387*3e14f97fSRoger A. Faulkner: ${_foo[bar=$exp]} 388*3e14f97fSRoger A. Faulkner(( bar == $exp )) || err_exit "subscript of unset variable not evaluated -- expected '$exp', got '$got'" 3897c2fbfb3SApril Chinunset foo bar 3907c2fbfb3SApril Chinfoo[5]=4 3917c2fbfb3SApril Chinbar[4]=3 3927c2fbfb3SApril Chinbar[0]=foo 3937c2fbfb3SApril Chinfoo[0]=bam 3947c2fbfb3SApril Chinfoo[4]=5 3957c2fbfb3SApril Chin[[ ${!foo[2+2]} == 'foo[4]' ]] || err_exit '${!var[sub]} should be var[sub]' 3967c2fbfb3SApril Chin[[ ${bar[${foo[5]}]} == 3 ]] || err_exit 'array subscript cannot be an array instance' 3977c2fbfb3SApril Chin[[ $bar[4] == 3 ]] || err_exit '$bar[x] != ${bar[x]} inside [[ ]]' 3987c2fbfb3SApril Chin(( $bar[4] == 3 )) || err_exit '$bar[x] != ${bar[x]} inside (( ))' 3997c2fbfb3SApril Chin[[ $bar[$foo[5]] == 3 ]] || err_exit '$bar[foo[x]] != ${bar[foo[x]]} inside [[ ]]' 4007c2fbfb3SApril Chin(( $bar[$foo[5]] == 3 )) || err_exit '$bar[foo[x]] != ${bar[foo[x]]} inside (( ))' 4017c2fbfb3SApril Chinx=$bar[4] 4027c2fbfb3SApril Chin[[ $x == 4 ]] && err_exit '$bar[4] should not be an array in an assignment' 4037c2fbfb3SApril Chinx=${bar[$foo[5]]} 4047c2fbfb3SApril Chin(( $x == 3 )) || err_exit '${bar[$foo[sub]]} not working' 4057c2fbfb3SApril Chin[[ $($SHELL <<- \++EOF+++ 4067c2fbfb3SApril Chin typeset -i test_variable=0 4077c2fbfb3SApril Chin typeset -A test_array 4087c2fbfb3SApril Chin test_array[1]=100 4097c2fbfb3SApril Chin read test_array[2] <<-! 4107c2fbfb3SApril Chin 2 4117c2fbfb3SApril Chin ! 4127c2fbfb3SApril Chin read test_array[3] <<-! 4137c2fbfb3SApril Chin 3 4147c2fbfb3SApril Chin ! 4157c2fbfb3SApril Chin test_array[3]=4 4167c2fbfb3SApril Chin print "val=${test_array[3]}" 4177c2fbfb3SApril Chin++EOF+++ 4187c2fbfb3SApril Chin) == val=4 ]] 2> /dev/null || err_exit 'after reading array[j] and assign array[j] fails' 4197c2fbfb3SApril Chin[[ $($SHELL <<- \+++EOF+++ 4207c2fbfb3SApril Chin pastebin=( typeset -a form) 4217c2fbfb3SApril Chin pastebin.form+=( name="name" data="clueless" ) 4227c2fbfb3SApril Chin print -r -- ${pastebin.form[0].name} 4237c2fbfb3SApril Chin+++EOF+++ 4247c2fbfb3SApril Chin) == name ]] 2> /dev/null || err_exit 'indexed array in compound variable not working' 4257c2fbfb3SApril Chinunset foo bar 4267c2fbfb3SApril Chin: ${foo[bar=2]} 4277c2fbfb3SApril Chin[[ $bar == 2 ]] || err_exit 'subscript not evaluated for unset variable' 4287c2fbfb3SApril Chinunset foo bar 4297c2fbfb3SApril Chinbar=1 4307c2fbfb3SApril Chintypeset -a foo=([1]=ok [2]=no) 4317c2fbfb3SApril Chin[[ $foo[bar] == ok ]] || err_exit 'typeset -a not working for simple assignment' 4327c2fbfb3SApril Chinunset foo 4337c2fbfb3SApril Chintypeset -a foo=([1]=(x=ok) [2]=(x=no)) 4347c2fbfb3SApril Chin[[ $(typeset | grep 'foo$') == *index* ]] || err_exit 'typeset -a not creating an indexed array' 4357c2fbfb3SApril Chinfoo+=([5]=good) 4367c2fbfb3SApril Chin[[ $(typeset | grep 'foo$') == *index* ]] || err_exit 'append to indexed array not preserving array type' 4377c2fbfb3SApril Chinunset foo 4387c2fbfb3SApril Chintypeset -A foo=([1]=ok [2]=no) 4397c2fbfb3SApril Chin[[ $foo[bar] == ok ]] && err_exit 'typeset -A not working for simple assignment' 4407c2fbfb3SApril Chinunset foo 4417c2fbfb3SApril Chintypeset -A foo=([1]=(x=ok) [2]=(x=no)) 4427c2fbfb3SApril Chin[[ ${foo[bar].x} == ok ]] && err_exit 'typeset -A not working for compound assignment' 4437c2fbfb3SApril Chin[[ $($SHELL -c 'typeset -a foo;typeset | grep "foo$"' 2> /dev/null) == *index* ]] || err_exit 'typeset fails for indexed array with no elements' 4447c2fbfb3SApril Chinxxxxx=(one) 4457c2fbfb3SApril Chin[[ $(typeset | grep xxxxx$) == *'indexed array'* ]] || err_exit 'array of one element not an indexed array' 4467c2fbfb3SApril Chinunset foo 4477c2fbfb3SApril Chinfoo[1]=(x=3 y=4) 4487c2fbfb3SApril Chin{ [[ ${!foo[1].*} == 'foo[1].x foo[1].y' ]] ;} 2> /dev/null || err_exit '${!foo[sub].*} not expanding correctly' 4497c2fbfb3SApril Chinunset x 4507c2fbfb3SApril Chinx=( typeset -a foo=( [0]="a" [1]="b" [2]="c" )) 4517c2fbfb3SApril Chin[[ ${@x.foo} == 'typeset -a'* ]] || err_exit 'x.foo is not an indexed array' 4527c2fbfb3SApril Chinx=( typeset -A foo=( [0]="a" [1]="b" [2]="c" )) 4537c2fbfb3SApril Chin[[ ${@x.foo} == 'typeset -A'* ]] || err_exit 'x.foo is not an associative array' 4547c2fbfb3SApril Chin$SHELL -c $'x=(foo\n\tbar\nbam\n)' 2> /dev/null || err_exit 'compound array assignment with new-lines not working' 4557c2fbfb3SApril Chin$SHELL -c $'x=(foo\n\tbar:\nbam\n)' 2> /dev/null || err_exit 'compound array assignment with labels not working' 4567c2fbfb3SApril Chin$SHELL -c $'x=(foo\n\tdone\nbam\n)' 2> /dev/null || err_exit 'compound array assignment with reserved words not working' 4577c2fbfb3SApril Chin[[ $($SHELL -c 'typeset -A A; print $(( A[foo].bar ))' 2> /dev/null) == 0 ]] || err_exit 'unset variable not evaluating to 0' 4587c2fbfb3SApril Chinunset a 4597c2fbfb3SApril Chintypeset -A a 4607c2fbfb3SApril China[a].z=1 4617c2fbfb3SApril China[z].z=2 4627c2fbfb3SApril Chinunset a[a] 4637c2fbfb3SApril Chin[[ ${!a[@]} == z ]] || err_exit '"unset a[a]" unsets entire array' 4647c2fbfb3SApril Chinunset a 4657c2fbfb3SApril China=([x]=1 [y]=2 [z]=(foo=3 bar=4)) 4667c2fbfb3SApril Chineval "b=$(printf "%B\n" a)" 4677c2fbfb3SApril Chineval "c=$(printf "%#B\n" a)" 4687c2fbfb3SApril Chin[[ ${a[*]} == "${b[*]}" ]] || err_exit 'printf %B not preserving values for arrays' 4697c2fbfb3SApril Chin[[ ${a[*]} == "${c[*]}" ]] || err_exit 'printf %#B not preserving values for arrays' 4707c2fbfb3SApril Chinunset a 4717c2fbfb3SApril China=(zero one two three four) 4727c2fbfb3SApril China[6]=six 4737c2fbfb3SApril Chin[[ ${a[-1]} == six ]] || err_exit 'a[-1] should be six' 4747c2fbfb3SApril Chin[[ ${a[-3]} == four ]] || err_exit 'a[-3] should be four' 4757c2fbfb3SApril Chin[[ ${a[-3..-1]} == 'four six' ]] || err_exit "a[-3,-1] should be 'four six'" 47634f9b3eeSRoland Mainz 47734f9b3eeSRoland MainzFILTER=(typeset scope) 47834f9b3eeSRoland MainzFILTER[0].scope=include 47934f9b3eeSRoland MainzFILTER[1].scope=exclude 48034f9b3eeSRoland Mainz[[ ${#FILTER[@]} == 2 ]] || err_exit "FILTER array should have two elements not ${#FILTER[@]}" 48134f9b3eeSRoland Mainz 482*3e14f97fSRoger A. Faulknerunset x 483*3e14f97fSRoger A. Faulknerfunction x.get 484*3e14f97fSRoger A. Faulkner{ 485*3e14f97fSRoger A. Faulkner print sub=${.sh.subscript} 486*3e14f97fSRoger A. Faulkner} 487*3e14f97fSRoger A. Faulknerx[2]= 488*3e14f97fSRoger A. Faulknerz=$(: ${x[1]} ) 489*3e14f97fSRoger A. Faulkner[[ $z == sub=1 ]] || err_exit 'get function not invoked for index array' 490*3e14f97fSRoger A. Faulkner 491*3e14f97fSRoger A. Faulknerunset x 492*3e14f97fSRoger A. Faulknertypeset -A x 493*3e14f97fSRoger A. Faulknerfunction x.get 494*3e14f97fSRoger A. Faulkner{ 495*3e14f97fSRoger A. Faulkner print sub=${.sh.subscript} 496*3e14f97fSRoger A. Faulkner} 497*3e14f97fSRoger A. Faulknerx[2]= 498*3e14f97fSRoger A. Faulknerz=$(: ${x[1]} ) 499*3e14f97fSRoger A. Faulkner[[ $z == sub=1 ]] || err_exit 'get function not invoked for associative array' 500*3e14f97fSRoger A. Faulkner 501da2e3ebdSchinexit $((Errors)) 502