| 1 | #
 | 
|---|
| 2 | # A suite of tests for bash word expansions
 | 
|---|
| 3 | #
 | 
|---|
| 4 | # This tests parameter and variable expansion, with an empahsis on
 | 
|---|
| 5 | # proper quoting behavior.
 | 
|---|
| 6 | #
 | 
|---|
| 7 | # Chet Ramey
 | 
|---|
| 8 | 
 | 
|---|
| 9 | #
 | 
|---|
| 10 | # If you comment out the body of this function, you can do a diff against
 | 
|---|
| 11 | # `expansion-tests.right' to see if the shell is behaving correctly
 | 
|---|
| 12 | #
 | 
|---|
| 13 | expect()
 | 
|---|
| 14 | {
 | 
|---|
| 15 |         echo expect "$@"
 | 
|---|
| 16 | }
 | 
|---|
| 17 | 
 | 
|---|
| 18 | # Test the substitution quoting characters (CTLESC and CTLNUL) in different
 | 
|---|
| 19 | # combinations
 | 
|---|
| 20 | 
 | 
|---|
| 21 | expect "<^A>"
 | 
|---|
| 22 | recho `echo ''`
 | 
|---|
| 23 | expect "<^A>"
 | 
|---|
| 24 | recho `echo ""`
 | 
|---|
| 25 | expect "<^B>"
 | 
|---|
| 26 | recho `echo ''`
 | 
|---|
| 27 | expect "<^B>"
 | 
|---|
| 28 | recho `echo ""`
 | 
|---|
| 29 | expect "<^A>"
 | 
|---|
| 30 | recho `echo `
 | 
|---|
| 31 | expect "<^B>"
 | 
|---|
| 32 | recho `echo `
 | 
|---|
| 33 | 
 | 
|---|
| 34 | # Test null strings without variable expansion
 | 
|---|
| 35 | expect "<abcdefgh>"
 | 
|---|
| 36 | recho abcd""efgh
 | 
|---|
| 37 | expect "<abcdefgh>"
 | 
|---|
| 38 | recho abcd''efgh
 | 
|---|
| 39 | expect "<abcdefgh>"
 | 
|---|
| 40 | recho ""abcdefgh
 | 
|---|
| 41 | expect "<abcdefgh>"
 | 
|---|
| 42 | recho ''abcdefgh
 | 
|---|
| 43 | expect "<abcd>"
 | 
|---|
| 44 | recho abcd""
 | 
|---|
| 45 | expect "<abcd>"
 | 
|---|
| 46 | recho abcd''
 | 
|---|
| 47 | 
 | 
|---|
| 48 | # Test the quirky behavior of $@ in ""
 | 
|---|
| 49 | expect nothing
 | 
|---|
| 50 | recho "$@"
 | 
|---|
| 51 | expect "< >"
 | 
|---|
| 52 | recho " $@"
 | 
|---|
| 53 | expect "<-->"
 | 
|---|
| 54 | recho "-${@}-"
 | 
|---|
| 55 | 
 | 
|---|
| 56 | # Test null strings with variable expansion that fails
 | 
|---|
| 57 | expect '<>'
 | 
|---|
| 58 | recho $xxx""
 | 
|---|
| 59 | expect '<>'
 | 
|---|
| 60 | recho ""$xxx
 | 
|---|
| 61 | expect '<>'
 | 
|---|
| 62 | recho $xxx''
 | 
|---|
| 63 | expect '<>'
 | 
|---|
| 64 | recho ''$xxx
 | 
|---|
| 65 | expect '<>'
 | 
|---|
| 66 | recho $xxx""$yyy
 | 
|---|
| 67 | expect '<>'
 | 
|---|
| 68 | recho $xxx''$yyy
 | 
|---|
| 69 | 
 | 
|---|
| 70 | # Test null strings with variable expansion that succeeds
 | 
|---|
| 71 | xxx=abc
 | 
|---|
| 72 | yyy=def
 | 
|---|
| 73 | 
 | 
|---|
| 74 | expect '<abc>'
 | 
|---|
| 75 | recho $xxx""
 | 
|---|
| 76 | expect '<abc>'
 | 
|---|
| 77 | recho ""$xxx
 | 
|---|
| 78 | expect '<abc>'
 | 
|---|
| 79 | recho $xxx''
 | 
|---|
| 80 | expect '<abc>'
 | 
|---|
| 81 | recho ''$xxx
 | 
|---|
| 82 | expect '<abcdef>'
 | 
|---|
| 83 | recho $xxx""$yyy
 | 
|---|
| 84 | expect '<abcdef>'
 | 
|---|
| 85 | recho $xxx''$yyy
 | 
|---|
| 86 | 
 | 
|---|
| 87 | unset xxx yyy
 | 
|---|
| 88 | 
 | 
|---|
| 89 | # Test the unquoted special quoting characters
 | 
|---|
| 90 | expect "<^A>"
 | 
|---|
| 91 | recho 
 | 
|---|
| 92 | expect "<^B>"
 | 
|---|
| 93 | recho 
 | 
|---|
| 94 | expect "<^A>"
 | 
|---|
| 95 | recho ""
 | 
|---|
| 96 | expect "<^B>"
 | 
|---|
| 97 | recho ""
 | 
|---|
| 98 | expect "<^A>"
 | 
|---|
| 99 | recho ''
 | 
|---|
| 100 | expect "<^B>"
 | 
|---|
| 101 | recho ''
 | 
|---|
| 102 | 
 | 
|---|
| 103 | # Test expansion of a variable that is unset
 | 
|---|
| 104 | expect nothing
 | 
|---|
| 105 | recho $xxx
 | 
|---|
| 106 | expect '<>'
 | 
|---|
| 107 | recho "$xxx"
 | 
|---|
| 108 | 
 | 
|---|
| 109 | expect nothing
 | 
|---|
| 110 | recho "$xxx${@}"
 | 
|---|
| 111 | 
 | 
|---|
| 112 | # Test empty string expansion
 | 
|---|
| 113 | expect '<>'
 | 
|---|
| 114 | recho ""
 | 
|---|
| 115 | expect '<>'
 | 
|---|
| 116 | recho ''
 | 
|---|
| 117 | 
 | 
|---|
| 118 | # Test command substitution with (disabled) history substitution
 | 
|---|
| 119 | expect '<Hello World!>'
 | 
|---|
| 120 | # set +H
 | 
|---|
| 121 | recho "`echo \"Hello world!\"`"
 | 
|---|
| 122 | 
 | 
|---|
| 123 | # Test some shell special characters
 | 
|---|
| 124 | expect '<`>'
 | 
|---|
| 125 | recho "\`"
 | 
|---|
| 126 | expect '<">'
 | 
|---|
| 127 | recho "\""
 | 
|---|
| 128 | expect '<\^A>'
 | 
|---|
| 129 | recho "\"
 | 
|---|
| 130 | 
 | 
|---|
| 131 | expect '<\$>'
 | 
|---|
| 132 | recho "\\$"
 | 
|---|
| 133 | 
 | 
|---|
| 134 | expect '<\\>'
 | 
|---|
| 135 | recho "\\\\"
 | 
|---|
| 136 | 
 | 
|---|
| 137 | # This should give argv[1] = a argv[2] = b
 | 
|---|
| 138 | expect '<a> <b>'
 | 
|---|
| 139 | FOO=`echo 'a b' | tr ' ' '\012'`
 | 
|---|
| 140 | recho $FOO
 | 
|---|
| 141 | 
 | 
|---|
| 142 | # This should give argv[1] = ^A argv[2] = ^B
 | 
|---|
| 143 | expect '<^A> <^B>'
 | 
|---|
| 144 | FOO=`echo ' ' | tr ' ' '\012'`
 | 
|---|
| 145 | recho $FOO
 | 
|---|
| 146 | 
 | 
|---|
| 147 | # Test quoted and unquoted globbing characters
 | 
|---|
| 148 | expect '<**>'
 | 
|---|
| 149 | recho "*"*
 | 
|---|
| 150 | 
 | 
|---|
| 151 | expect '<\.\./*/>'
 | 
|---|
| 152 | recho "\.\./*/"
 | 
|---|
| 153 | 
 | 
|---|
| 154 | # Test patterns that come up when the shell quotes funny character
 | 
|---|
| 155 | # combinations
 | 
|---|
| 156 | expect '<^A^B^A^B>'
 | 
|---|
| 157 | recho ''
 | 
|---|
| 158 | expect '<^A^A>'
 | 
|---|
| 159 | recho ''
 | 
|---|
| 160 | expect '<^A^B>'
 | 
|---|
| 161 | recho ''
 | 
|---|
| 162 | expect '<^A^A^B>'
 | 
|---|
| 163 | recho ''
 | 
|---|
| 164 | 
 | 
|---|
| 165 | # More tests of "$@"
 | 
|---|
| 166 | set abc def ghi jkl
 | 
|---|
| 167 | expect '<  abc> <def> <ghi> <jkl  >'
 | 
|---|
| 168 | recho "  $@  "
 | 
|---|
| 169 | expect '<  abc> <def> <ghi> <jkl  >'
 | 
|---|
| 170 | recho "${1+  $@  }"
 | 
|---|
| 171 | 
 | 
|---|
| 172 | set abc def ghi jkl
 | 
|---|
| 173 | expect '<--abc> <def> <ghi> <jkl-->'
 | 
|---|
| 174 | recho "--$@--"
 | 
|---|
| 175 | 
 | 
|---|
| 176 | set "a b" cd ef gh
 | 
|---|
| 177 | expect '<a b> <cd> <ef> <gh>'
 | 
|---|
| 178 | recho ${1+"$@"}
 | 
|---|
| 179 | expect '<a b> <cd> <ef> <gh>'
 | 
|---|
| 180 | recho ${foo:-"$@"}
 | 
|---|
| 181 | expect '<a b> <cd> <ef> <gh>'
 | 
|---|
| 182 | recho "${@}"
 | 
|---|
| 183 | 
 | 
|---|
| 184 | expect '<  >'
 | 
|---|
| 185 | recho "  "
 | 
|---|
| 186 | expect '< - >'
 | 
|---|
| 187 | recho " - "
 | 
|---|
| 188 | 
 | 
|---|
| 189 | # Test combinations of different types of quoting in a fully-quoted string
 | 
|---|
| 190 | # (so the WHOLLY_QUOTED tests fail and it doesn't get set)
 | 
|---|
| 191 | expect '</^root:/{s/^[^:]*:[^:]*:\([^:]*\).*$/\1/>'
 | 
|---|
| 192 | recho "/^root:/{s/^[^:]*:[^:]*:\([^:]*\).*"'$'"/\1/"
 | 
|---|
| 193 | 
 | 
|---|
| 194 | # Test the various Posix parameter expansions
 | 
|---|
| 195 | 
 | 
|---|
| 196 | expect '<foo bar>'
 | 
|---|
| 197 | recho "${x:-$(echo "foo bar")}"
 | 
|---|
| 198 | expect '<foo> <bar>'
 | 
|---|
| 199 | recho ${x:-$(echo "foo bar")}
 | 
|---|
| 200 | 
 | 
|---|
| 201 | unset X
 | 
|---|
| 202 | expect '<abc>'
 | 
|---|
| 203 | recho ${X:=abc}
 | 
|---|
| 204 | expect '<abc>'
 | 
|---|
| 205 | recho $X
 | 
|---|
| 206 | 
 | 
|---|
| 207 | set a b c
 | 
|---|
| 208 | expect '<posix>'
 | 
|---|
| 209 | recho ${3:+posix}
 | 
|---|
| 210 | 
 | 
|---|
| 211 | POSIX=/usr/posix
 | 
|---|
| 212 | expect '<10>'
 | 
|---|
| 213 | recho ${#POSIX}
 | 
|---|
| 214 | 
 | 
|---|
| 215 | # remove shortest trailing match
 | 
|---|
| 216 | x=file.c
 | 
|---|
| 217 | expect '<file.o>'
 | 
|---|
| 218 | recho ${x%.c}.o
 | 
|---|
| 219 | 
 | 
|---|
| 220 | # remove longest trailing match
 | 
|---|
| 221 | x=posix/src/std
 | 
|---|
| 222 | expect '<posix>'
 | 
|---|
| 223 | recho ${x%%/*}
 | 
|---|
| 224 | 
 | 
|---|
| 225 | # remove shortest leading pattern
 | 
|---|
| 226 | x=$HOME/src/cmd
 | 
|---|
| 227 | expect '</src/cmd>'
 | 
|---|
| 228 | recho ${x#$HOME}
 | 
|---|
| 229 | 
 | 
|---|
| 230 | # remove longest leading pattern
 | 
|---|
| 231 | x=/one/two/three
 | 
|---|
| 232 | expect '<three>'
 | 
|---|
| 233 | recho ${x##*/}
 | 
|---|
| 234 | 
 | 
|---|
| 235 | # pattern removal of patterns that don't match
 | 
|---|
| 236 | z=abcdef
 | 
|---|
| 237 | 
 | 
|---|
| 238 | expect '<abcdef>'
 | 
|---|
| 239 | recho ${z#xyz}
 | 
|---|
| 240 | expect '<abcdef>'
 | 
|---|
| 241 | recho ${z##xyz}
 | 
|---|
| 242 | 
 | 
|---|
| 243 | expect '<abcdef>'
 | 
|---|
| 244 | recho ${z%xyz}
 | 
|---|
| 245 | expect '<abcdef>'
 | 
|---|
| 246 | recho ${z%%xyz}
 | 
|---|
| 247 | 
 | 
|---|
| 248 | # Command substitution and the quirky differences between `` and $()
 | 
|---|
| 249 | 
 | 
|---|
| 250 | expect '<\$x>'
 | 
|---|
| 251 | recho '\$x'
 | 
|---|
| 252 | 
 | 
|---|
| 253 | expect '<$x>'
 | 
|---|
| 254 | recho `echo '\$x'`
 | 
|---|
| 255 | 
 | 
|---|
| 256 | expect '<\$x>'
 | 
|---|
| 257 | recho $(echo '\$x')
 | 
|---|
| 258 | 
 | 
|---|
| 259 | # The difference between $* "$*" and "$@"
 | 
|---|
| 260 | 
 | 
|---|
| 261 | set "abc" "def ghi" "jkl"
 | 
|---|
| 262 | 
 | 
|---|
| 263 | expect '<abc> <def> <ghi> <jkl>'
 | 
|---|
| 264 | recho $*
 | 
|---|
| 265 | 
 | 
|---|
| 266 | expect '<abc def ghi jkl>'
 | 
|---|
| 267 | recho "$*"
 | 
|---|
| 268 | 
 | 
|---|
| 269 | OIFS="$IFS"
 | 
|---|
| 270 | IFS=":$IFS"
 | 
|---|
| 271 | 
 | 
|---|
| 272 | # The special behavior of "$*", using the first character of $IFS as separator
 | 
|---|
| 273 | expect '<abc:def ghi:jkl>'
 | 
|---|
| 274 | recho "$*"
 | 
|---|
| 275 | 
 | 
|---|
| 276 | IFS="$OIFS"
 | 
|---|
| 277 | 
 | 
|---|
| 278 | expect '<abc> <def ghi> <jkl>'
 | 
|---|
| 279 | recho "$@"
 | 
|---|
| 280 | 
 | 
|---|
| 281 | expect '<xxabc> <def ghi> <jklyy>'
 | 
|---|
| 282 | recho "xx$@yy"
 | 
|---|
| 283 | 
 | 
|---|
| 284 | expect '<abc> <def ghi> <jklabc> <def ghi> <jkl>'
 | 
|---|
| 285 | recho "$@$@"
 | 
|---|
| 286 | 
 | 
|---|
| 287 | foo=abc
 | 
|---|
| 288 | bar=def
 | 
|---|
| 289 | 
 | 
|---|
| 290 | expect '<abcdef>'
 | 
|---|
| 291 | recho "$foo""$bar"
 | 
|---|
| 292 | 
 | 
|---|
| 293 | unset foo
 | 
|---|
| 294 | set $foo bar '' xyz "$foo" abc
 | 
|---|
| 295 | 
 | 
|---|
| 296 | expect '<bar> <> <xyz> <> <abc>'
 | 
|---|
| 297 | recho "$@"
 | 
|---|
| 298 | 
 | 
|---|
| 299 | # More tests of quoting and deferred evaluation
 | 
|---|
| 300 | 
 | 
|---|
| 301 | foo=10 x=foo
 | 
|---|
| 302 | y='$'$x
 | 
|---|
| 303 | expect '<$foo>'
 | 
|---|
| 304 | recho $y
 | 
|---|
| 305 | eval y='$'$x
 | 
|---|
| 306 | expect '<10>'
 | 
|---|
| 307 | recho $y
 | 
|---|
| 308 | 
 | 
|---|
| 309 | # case statements
 | 
|---|
| 310 | 
 | 
|---|
| 311 | NL='
 | 
|---|
| 312 | '
 | 
|---|
| 313 | x='ab
 | 
|---|
| 314 | cd'
 | 
|---|
| 315 | 
 | 
|---|
| 316 | expect '<newline expected>'
 | 
|---|
| 317 | case "$x" in
 | 
|---|
| 318 | *$NL*)  recho "newline expected" ;;
 | 
|---|
| 319 | esac
 | 
|---|
| 320 | 
 | 
|---|
| 321 | expect '<got it>'
 | 
|---|
| 322 | case \? in
 | 
|---|
| 323 | *"?"*) recho "got it" ;;
 | 
|---|
| 324 | esac
 | 
|---|
| 325 | 
 | 
|---|
| 326 | expect '<got it>'
 | 
|---|
| 327 | case \? in
 | 
|---|
| 328 | *\?*) recho "got it" ;;
 | 
|---|
| 329 | esac
 | 
|---|
| 330 | 
 | 
|---|
| 331 | set one two three four five
 | 
|---|
| 332 | expect '<one> <three> <five>'
 | 
|---|
| 333 | recho $1 $3 ${5} $8 ${9}
 | 
|---|
| 334 | 
 | 
|---|
| 335 | # length tests on positional parameters and some special parameters
 | 
|---|
| 336 | 
 | 
|---|
| 337 | expect '<5> <5>'
 | 
|---|
| 338 | recho $# ${#}
 | 
|---|
| 339 | expect '<3>'
 | 
|---|
| 340 | recho ${#1}
 | 
|---|
| 341 | expect '<1>'
 | 
|---|
| 342 | recho ${##}
 | 
|---|
| 343 | expect '<1>'
 | 
|---|
| 344 | recho ${#?}
 | 
|---|
| 345 | expect '<5>'
 | 
|---|
| 346 | recho ${#@}
 | 
|---|
| 347 | expect '<5>'
 | 
|---|
| 348 | recho ${#*}
 | 
|---|
| 349 | expect '<5>'
 | 
|---|
| 350 | recho "${#@}"
 | 
|---|
| 351 | expect '<5>'
 | 
|---|
| 352 | recho "${#*}"
 | 
|---|
| 353 | 
 | 
|---|
| 354 | expect '<42>'
 | 
|---|
| 355 | recho $((28 + 14))
 | 
|---|
| 356 | expect '<26>'
 | 
|---|
| 357 | recho $[ 13 * 2 ]
 | 
|---|
| 358 | 
 | 
|---|
| 359 | expect '<\>'
 | 
|---|
| 360 | recho `echo \\\\`
 | 
|---|
| 361 | 
 | 
|---|
| 362 | expect '<~>'
 | 
|---|
| 363 | recho '~'
 | 
|---|
| 364 | 
 | 
|---|
| 365 | expect nothing
 | 
|---|
| 366 | recho $!
 | 
|---|
| 367 | expect nothing
 | 
|---|
| 368 | recho ${!}
 | 
|---|
| 369 | 
 | 
|---|
| 370 | # test word splitting of assignment statements not preceding a command
 | 
|---|
| 371 | a="a b c d e"
 | 
|---|
| 372 | declare b=$a
 | 
|---|
| 373 | expect '<a> <b> <c> <d> <e>'
 | 
|---|
| 374 | recho $b
 | 
|---|
| 375 | 
 | 
|---|
| 376 | a="a?b?c"
 | 
|---|
| 377 | 
 | 
|---|
| 378 | echo ${a//\\?/ }
 | 
|---|
| 379 | 
 | 
|---|
| 380 | echo ${a//\?/ }
 | 
|---|