| 1 | # this is needed so that the bad assignments (b[]=bcde, for example) do not
|
|---|
| 2 | # cause fatal shell errors when in posix mode
|
|---|
| 3 | set +o posix
|
|---|
| 4 |
|
|---|
| 5 | set +a
|
|---|
| 6 | # The calls to egrep -v are to filter out builtin array variables that are
|
|---|
| 7 | # automatically set and possibly contain values that vary.
|
|---|
| 8 |
|
|---|
| 9 | # first make sure we handle the basics
|
|---|
| 10 | x=()
|
|---|
| 11 | echo ${x[@]}
|
|---|
| 12 | unset x
|
|---|
| 13 |
|
|---|
| 14 | # this should be an error
|
|---|
| 15 | test=(first & second)
|
|---|
| 16 | echo $?
|
|---|
| 17 | unset test
|
|---|
| 18 |
|
|---|
| 19 | # make sure declare -a converts an existing variable to an array
|
|---|
| 20 | unset a
|
|---|
| 21 | a=abcde
|
|---|
| 22 | declare -a a
|
|---|
| 23 | echo ${a[0]}
|
|---|
| 24 |
|
|---|
| 25 | unset a
|
|---|
| 26 | a=abcde
|
|---|
| 27 | a[2]=bdef
|
|---|
| 28 |
|
|---|
| 29 | unset b
|
|---|
| 30 | declare -a b[256]
|
|---|
| 31 |
|
|---|
| 32 | unset c[2]
|
|---|
| 33 | unset c[*]
|
|---|
| 34 |
|
|---|
| 35 | a[1]=
|
|---|
| 36 |
|
|---|
| 37 | _ENV=/bin/true
|
|---|
| 38 | x=${_ENV[(_$-=0)+(_=1)-_${-%%*i*}]}
|
|---|
| 39 |
|
|---|
| 40 | declare -r c[100]
|
|---|
| 41 |
|
|---|
| 42 | echo ${a[0]} ${a[4]}
|
|---|
| 43 | echo ${a[@]}
|
|---|
| 44 |
|
|---|
| 45 | echo ${a[*]}
|
|---|
| 46 |
|
|---|
| 47 | # this should print out values, too
|
|---|
| 48 | declare -a | egrep -v '(BASH_VERSINFO|PIPESTATUS|GROUPS)'
|
|---|
| 49 |
|
|---|
| 50 | unset a[7]
|
|---|
| 51 | echo ${a[*]}
|
|---|
| 52 |
|
|---|
| 53 | unset a[4]
|
|---|
| 54 | echo ${a[*]}
|
|---|
| 55 |
|
|---|
| 56 | echo ${a}
|
|---|
| 57 | echo "${a}"
|
|---|
| 58 | echo $a
|
|---|
| 59 |
|
|---|
| 60 | unset a[0]
|
|---|
| 61 | echo ${a}
|
|---|
| 62 |
|
|---|
| 63 | echo ${a[@]}
|
|---|
| 64 |
|
|---|
| 65 | a[5]="hello world"
|
|---|
| 66 | echo ${a[5]}
|
|---|
| 67 | echo ${#a[5]}
|
|---|
| 68 |
|
|---|
| 69 | echo ${#a[@]}
|
|---|
| 70 |
|
|---|
| 71 | a[4+5/2]="test expression"
|
|---|
| 72 | echo ${a[@]}
|
|---|
| 73 |
|
|---|
| 74 | readonly a[5]
|
|---|
| 75 | readonly a
|
|---|
| 76 | # these two lines should output `declare' commands
|
|---|
| 77 | readonly -a | egrep -v '(BASH_VERSINFO|PIPESTATUS|GROUPS)'
|
|---|
| 78 | declare -ar | egrep -v '(BASH_VERSINFO|PIPESTATUS|GROUPS)'
|
|---|
| 79 | # this line should output `readonly' commands, even for arrays
|
|---|
| 80 | set -o posix
|
|---|
| 81 | readonly -a | egrep -v '(BASH_VERSINFO|PIPESTATUS|GROUPS)'
|
|---|
| 82 | set +o posix
|
|---|
| 83 |
|
|---|
| 84 | declare -a d='([1]="" [2]="bdef" [5]="hello world" "test")'
|
|---|
| 85 | d[9]="ninth element"
|
|---|
| 86 |
|
|---|
| 87 | declare -a e[10]=test # this works in post-bash-2.05 versions
|
|---|
| 88 | declare -a e[10]='(test)'
|
|---|
| 89 |
|
|---|
| 90 | pass=/etc/passwd
|
|---|
| 91 | declare -a f='("${d[@]}")'
|
|---|
| 92 | b=([0]=this [1]=is [2]=a [3]=test [4]="$PS1" [5]=$pass)
|
|---|
| 93 |
|
|---|
| 94 | echo ${b[@]:2:3}
|
|---|
| 95 |
|
|---|
| 96 | declare -pa | egrep -v '(BASH_VERSINFO|PIPESTATUS|GROUPS)'
|
|---|
| 97 |
|
|---|
| 98 | a[3]="this is a test"
|
|---|
| 99 |
|
|---|
| 100 | b[]=bcde
|
|---|
| 101 | b[*]=aaa
|
|---|
| 102 | echo ${b[ ]}
|
|---|
| 103 |
|
|---|
| 104 | c[-2]=4
|
|---|
| 105 | echo ${c[-4]}
|
|---|
| 106 |
|
|---|
| 107 | d[7]=(abdedfegeee)
|
|---|
| 108 |
|
|---|
| 109 | d=([]=abcde [1]="test test" [*]=last [-65]=negative )
|
|---|
| 110 |
|
|---|
| 111 | unset d[12]
|
|---|
| 112 | unset e[*]
|
|---|
| 113 |
|
|---|
| 114 | declare -a | egrep -v '(BASH_VERSINFO|PIPESTATUS|GROUPS)'
|
|---|
| 115 |
|
|---|
| 116 | ps1='hello'
|
|---|
| 117 | unset ps1[2]
|
|---|
| 118 | unset ${ps1[2]}
|
|---|
| 119 |
|
|---|
| 120 | declare +a ps1
|
|---|
| 121 | declare +a c
|
|---|
| 122 |
|
|---|
| 123 | # the prompt should not print when using a here doc
|
|---|
| 124 | read -p "array test: " -a rv <<!
|
|---|
| 125 | this is a test of read using arrays
|
|---|
| 126 | !
|
|---|
| 127 |
|
|---|
| 128 | echo ${rv[0]} ${rv[4]}
|
|---|
| 129 | echo ${rv[@]}
|
|---|
| 130 |
|
|---|
| 131 | # the variable should be converted to an array when `read -a' is done
|
|---|
| 132 | vv=1
|
|---|
| 133 | read -a vv <<!
|
|---|
| 134 | this is a test of arrays
|
|---|
| 135 | !
|
|---|
| 136 | echo ${vv[0]} ${vv[3]}
|
|---|
| 137 | echo ${vv[@]}
|
|---|
| 138 | unset vv
|
|---|
| 139 |
|
|---|
| 140 | declare -a | egrep -v '(BASH_VERSINFO|PIPESTATUS|GROUPS)'
|
|---|
| 141 |
|
|---|
| 142 | export rv
|
|---|
| 143 | #set
|
|---|
| 144 |
|
|---|
| 145 | x[4]=bbb
|
|---|
| 146 | x=abde
|
|---|
| 147 | echo $x
|
|---|
| 148 | echo ${x[0]}
|
|---|
| 149 | echo ${x[4]}
|
|---|
| 150 | echo efgh | ( read x[1] ; echo ${x[1]} )
|
|---|
| 151 | echo wxyz | ( declare -a x ; read x ; echo $x ; echo ${x[0]} )
|
|---|
| 152 |
|
|---|
| 153 | # Make sure that arrays can be used to save the positional paramters verbatim
|
|---|
| 154 | set -- a 'b c' d 'e f g' h
|
|---|
| 155 |
|
|---|
| 156 | ARGV=( [0]=$0 "$@" )
|
|---|
| 157 |
|
|---|
| 158 | for z in "${ARGV[@]}"
|
|---|
| 159 | do
|
|---|
| 160 | echo "$z"
|
|---|
| 161 | done
|
|---|
| 162 |
|
|---|
| 163 | echo "$0"
|
|---|
| 164 | for z in "$@"
|
|---|
| 165 | do
|
|---|
| 166 | echo "$z"
|
|---|
| 167 | done
|
|---|
| 168 |
|
|---|
| 169 | # do various pattern removal and length tests
|
|---|
| 170 | XPATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:.:/sbin:/usr/sbin
|
|---|
| 171 |
|
|---|
| 172 | xpath=( $( IFS=: ; echo $XPATH ) )
|
|---|
| 173 |
|
|---|
| 174 | echo ${xpath[@]}
|
|---|
| 175 | echo ${xpath[@]##*/}
|
|---|
| 176 | echo ${xpath[0]##*/}
|
|---|
| 177 | echo ${xpath[@]%%[!/]*}
|
|---|
| 178 | echo ${xpath[0]%%[!/]*}
|
|---|
| 179 | recho ${xpath##*/}
|
|---|
| 180 | recho ${xpath%%[!/]*}
|
|---|
| 181 | recho ${xpath[5]##*/}
|
|---|
| 182 | recho ${xpath[5]%%[!/]*}
|
|---|
| 183 |
|
|---|
| 184 | # let's try to make it a DOS-style path
|
|---|
| 185 |
|
|---|
| 186 | zecho "${xpath[@]/\//\\}"
|
|---|
| 187 | zecho "${xpath[@]//\//\\}"
|
|---|
| 188 | zecho "${xpath[@]//[\/]/\\}"
|
|---|
| 189 |
|
|---|
| 190 | # length of the first element of the array, since array without subscript
|
|---|
| 191 | # is equivalent to referencing first element
|
|---|
| 192 | echo ${#xpath} -- ${#xpath[0]}
|
|---|
| 193 |
|
|---|
| 194 | # number of elements in the array
|
|---|
| 195 | nelem=${#xpath[@]}
|
|---|
| 196 | echo ${#xpath[@]} -- $nelem
|
|---|
| 197 |
|
|---|
| 198 | # total length of all elements in the array, including space separators
|
|---|
| 199 | xx="${xpath[*]}"
|
|---|
| 200 | echo ${#xx}
|
|---|
| 201 |
|
|---|
| 202 | # total length of all elements in the array
|
|---|
| 203 | xx=$( IFS='' ; echo "${xpath[*]}" )
|
|---|
| 204 | echo ${#xx}
|
|---|
| 205 |
|
|---|
| 206 | unset xpath[nelem-1]
|
|---|
| 207 |
|
|---|
| 208 | nelem=${#xpath[@]}
|
|---|
| 209 | echo ${#xpath[@]} -- $nelem
|
|---|
| 210 |
|
|---|
| 211 | # arrays and things that look like index assignments
|
|---|
| 212 | array=(42 [1]=14 [2]=44)
|
|---|
| 213 |
|
|---|
| 214 | array2=(grep [ 123 ] \*)
|
|---|
| 215 |
|
|---|
| 216 | echo ${array[@]}
|
|---|
| 217 | echo "${array2[@]}"
|
|---|
| 218 |
|
|---|
| 219 | # arrays and implicit arithmetic evaluation
|
|---|
| 220 | declare -i -a iarray
|
|---|
| 221 |
|
|---|
| 222 | iarray=( 2+4 1+6 7+2 )
|
|---|
| 223 | echo ${iarray[@]}
|
|---|
| 224 |
|
|---|
| 225 | iarray[4]=4+1
|
|---|
| 226 | echo ${iarray[@]}
|
|---|
| 227 |
|
|---|
| 228 | # make sure assignment using the compound assignment syntax removes all
|
|---|
| 229 | # of the old elements from the array value
|
|---|
| 230 | barray=(old1 old2 old3 old4 old5)
|
|---|
| 231 | barray=(new1 new2 new3)
|
|---|
| 232 | echo "length = ${#barray[@]}"
|
|---|
| 233 | echo "value = ${barray[*]}"
|
|---|
| 234 |
|
|---|
| 235 | # make sure the array code behaves correctly with respect to unset variables
|
|---|
| 236 | set -u
|
|---|
| 237 | ( echo ${#narray[4]} )
|
|---|
| 238 |
|
|---|
| 239 | ${THIS_SH} ./array1.sub
|
|---|
| 240 | ${THIS_SH} ./array2.sub
|
|---|
| 241 |
|
|---|
| 242 | # some old bugs and ksh93 compatibility tests
|
|---|
| 243 | ${THIS_SH} ./array3.sub
|
|---|
| 244 |
|
|---|
| 245 | set +u
|
|---|
|
|---|