| 1 | expect()
|
|---|
| 2 | {
|
|---|
| 3 | echo expect "$@"
|
|---|
| 4 | }
|
|---|
| 5 |
|
|---|
| 6 | tool_var() {
|
|---|
| 7 | eval $1=\"\${$1:-$2}\"
|
|---|
| 8 | export $1
|
|---|
| 9 | }
|
|---|
| 10 |
|
|---|
| 11 | A="aaa bbb ccc"
|
|---|
| 12 |
|
|---|
| 13 | unset B
|
|---|
| 14 |
|
|---|
| 15 | tool_var B ${B:-"$A"}
|
|---|
| 16 |
|
|---|
| 17 | expect '<aaa bbb ccc>'
|
|---|
| 18 | recho "$A"
|
|---|
| 19 | expect '<aaa bbb ccc>'
|
|---|
| 20 | recho "$B"
|
|---|
| 21 |
|
|---|
| 22 | eto_prepend() {
|
|---|
| 23 | eval $1=\'$2\''${'$1':+":"${'$1'}}'; export $1
|
|---|
| 24 | }
|
|---|
| 25 |
|
|---|
| 26 | foo=bar; export foo
|
|---|
| 27 | eto_prepend foo baz
|
|---|
| 28 | expect '<baz:bar>'
|
|---|
| 29 | recho $foo
|
|---|
| 30 | expect '<baz:bar>'
|
|---|
| 31 | recho ${foo-"bar"}
|
|---|
| 32 |
|
|---|
| 33 | aa='aaa bbb ccc'
|
|---|
| 34 |
|
|---|
| 35 | expect '<aaa bbb ccc>'
|
|---|
| 36 | recho ${zzz-"$aa"}
|
|---|
| 37 | expect '<bar>'
|
|---|
| 38 | recho ${zzz:-"bar"}
|
|---|
| 39 | expect '<bar>'
|
|---|
| 40 | recho "${zzz:-bar}"
|
|---|
| 41 | expect '<bar>'
|
|---|
| 42 | recho "${zzz:-"bar"}"
|
|---|
| 43 |
|
|---|
| 44 | var=abcde
|
|---|
| 45 | expect '<abcde>'
|
|---|
| 46 | recho "${var:-xyz}"
|
|---|
| 47 | expect '<abcde>'
|
|---|
| 48 | recho "${var:=xyz}"
|
|---|
| 49 | expect '<xyz>'
|
|---|
| 50 | recho "${var:+xyz}"
|
|---|
| 51 |
|
|---|
| 52 | set 'a b' c d e f
|
|---|
| 53 | expect '<a b> <c> <d> <e> <f>'
|
|---|
| 54 | recho ${1+"$@"}
|
|---|
| 55 | expect '<a b>'
|
|---|
| 56 | recho "${1-"$@"}"
|
|---|
| 57 | expect '<a> <b>'
|
|---|
| 58 | recho ${1-"$@"}
|
|---|
| 59 | expect '<a b> <c> <d> <e> <f>'
|
|---|
| 60 | recho "${1+$@}"
|
|---|
| 61 | expect '<a b> <c> <d> <e> <f>'
|
|---|
| 62 | recho "${1+"$@"}"
|
|---|
| 63 |
|
|---|
| 64 | HOME=/usr/homes/chet
|
|---|
| 65 | somevar=
|
|---|
| 66 | expect "<$HOME>"
|
|---|
| 67 | recho ${somevar:-~}
|
|---|
| 68 | # This changed after bash-3.0, when the tilde implementation was redone. It's
|
|---|
| 69 | # not backward compatible, but it's very hard to be backward-compatible here,
|
|---|
| 70 | # and I think the old behavior was a bug
|
|---|
| 71 | expect '<~>'
|
|---|
| 72 | recho "${somevar:-~}"
|
|---|
| 73 | expect '<~>'
|
|---|
| 74 | recho "${somevar:-"~"}"
|
|---|
| 75 | expect '<\~>'
|
|---|
| 76 | recho "${somevar:-\~}"
|
|---|
| 77 | expect '<\ \~>'
|
|---|
| 78 | recho "${somevar:-\ \~}"
|
|---|
| 79 | expect '<\ \ \~>'
|
|---|
| 80 | recho "${somevar:-\ \ \~}"
|
|---|
| 81 |
|
|---|
| 82 | expect "<$HOME>"
|
|---|
| 83 | recho ${somevar:-$HOME}
|
|---|
| 84 | expect "<$HOME>"
|
|---|
| 85 | recho "${somevar:-$HOME}"
|
|---|
| 86 | expect "<$HOME>"
|
|---|
| 87 | recho "${somevar:-"$HOME"}"
|
|---|
| 88 | expect '<$HOME>'
|
|---|
| 89 | recho "${somevar:-\$HOME}"
|
|---|
| 90 | expect '<\ $HOME>'
|
|---|
| 91 | recho "${somevar:-\ \$HOME}"
|
|---|
| 92 | expect '<\ \ $HOME>'
|
|---|
| 93 | recho "${somevar:-\ \ \$HOME}"
|
|---|
| 94 |
|
|---|
| 95 | foo=bar
|
|---|
| 96 | expect "<'bar'>"
|
|---|
| 97 | recho "${foo+'$foo'}"
|
|---|
| 98 | expect "<'bar'>"
|
|---|
| 99 | recho "${fox='$foo'}"
|
|---|
| 100 |
|
|---|
| 101 | P='*@*'
|
|---|
| 102 | expect '<*@>'
|
|---|
| 103 | recho "${P%"*"}"
|
|---|
| 104 | expect '<*@>'
|
|---|
| 105 | recho "${P%'*'}"
|
|---|
| 106 |
|
|---|
| 107 | expect '<*@>'
|
|---|
| 108 | recho ${P%"*"}
|
|---|
| 109 | expect '<*@>'
|
|---|
| 110 | recho ${P%'*'}
|
|---|
| 111 |
|
|---|
| 112 | expect '<*@*>'
|
|---|
| 113 | recho ${P%""}
|
|---|
| 114 | expect '<*@*>'
|
|---|
| 115 | recho ${P#""}
|
|---|
| 116 |
|
|---|
| 117 | expect '<*@*>'
|
|---|
| 118 | recho ${P#"$foobar"}
|
|---|
| 119 | expect '<*@*>'
|
|---|
| 120 | recho ${P%"$foobar"}
|
|---|
| 121 |
|
|---|
| 122 | s1=abcdefghijkl
|
|---|
| 123 | s2=efgh
|
|---|
| 124 |
|
|---|
| 125 | first=${s1/$s2*/}
|
|---|
| 126 | expect '<abcd>'
|
|---|
| 127 | recho $first
|
|---|
| 128 |
|
|---|
| 129 | last=${s1##$first}
|
|---|
| 130 | expect '<efghijkl>'
|
|---|
| 131 | recho $last
|
|---|
| 132 |
|
|---|
| 133 | shift $#
|
|---|
| 134 | UNAME_RELEASE=${1:-4.2MP}
|
|---|
| 135 |
|
|---|
| 136 | RELEASE=`expr "$UNAME_RELEASE" : '[^0-9]*\([0-9]*\)'` # 4
|
|---|
| 137 | case "$RELEASE" in
|
|---|
| 138 | "") RELEASE=0 ;;
|
|---|
| 139 | *) RELEASE=`expr "$RELEASE" + 0` ;;
|
|---|
| 140 | esac
|
|---|
| 141 | REL_LEVEL=`expr "$UNAME_RELEASE" : '[^0-9]*[0-9]*.\([0-9]*\)'` # 1
|
|---|
| 142 | REL_SUBLEVEL=`expr "$UNAME_RELEASE" : '[^0-9]*[0-9]*.[0-9]*.\([0-9]*\)'` # 2
|
|---|
| 143 |
|
|---|
| 144 | expect '<4> <2>'
|
|---|
| 145 | recho $RELEASE $REL_LEVEL $REL_SUBLEVEL
|
|---|
| 146 |
|
|---|
| 147 | b1()
|
|---|
| 148 | {
|
|---|
| 149 | b2 ${1+"$@"}
|
|---|
| 150 | }
|
|---|
| 151 |
|
|---|
| 152 | b2()
|
|---|
| 153 | {
|
|---|
| 154 | recho $*
|
|---|
| 155 | recho $#
|
|---|
| 156 | }
|
|---|
| 157 |
|
|---|
| 158 | expect '<1>'
|
|---|
| 159 | b1 ''
|
|---|
| 160 |
|
|---|
| 161 | expect '<bar> <2>'
|
|---|
| 162 | b1 bar ''
|
|---|
| 163 |
|
|---|
| 164 | expect '<bar> <2>'
|
|---|
| 165 | b1 '' bar
|
|---|
| 166 |
|
|---|
| 167 | expect '<4>'
|
|---|
| 168 | b1 '' '' '' ''
|
|---|
| 169 |
|
|---|
| 170 | NL="\\
|
|---|
| 171 | "
|
|---|
| 172 |
|
|---|
| 173 | NNL="+$NL+"
|
|---|
| 174 |
|
|---|
| 175 | expect '<--\> <-->'
|
|---|
| 176 | recho --$NL--
|
|---|
| 177 | expect '<--\^J-->'
|
|---|
| 178 | recho "--$NL--"
|
|---|
| 179 |
|
|---|
| 180 | expect '<--+\> <+-->'
|
|---|
| 181 | recho --$NNL--
|
|---|
| 182 | expect '<--+\^J+-->'
|
|---|
| 183 | recho "--$NNL--"
|
|---|
| 184 |
|
|---|
| 185 | expect '<-+\> <+-\> <->'
|
|---|
| 186 | recho -$NNL-$NL-
|
|---|
| 187 |
|
|---|
| 188 | set ''
|
|---|
| 189 | expect '<xy>'
|
|---|
| 190 | recho "$*xy"
|
|---|
| 191 | expect '<xy>'
|
|---|
| 192 | recho "x$*y"
|
|---|
| 193 | expect '<xy>'
|
|---|
| 194 | recho "xy$*"
|
|---|
| 195 | expect '<xy>'
|
|---|
| 196 | recho x"$*"y
|
|---|
| 197 | expect '<xy>'
|
|---|
| 198 | recho xy"$*"
|
|---|
| 199 | expect '<xy>'
|
|---|
| 200 | recho "$*"xy
|
|---|
| 201 | expect '<>'
|
|---|
| 202 | recho "$*"
|
|---|
| 203 | expect nothing
|
|---|
| 204 | recho $*
|
|---|
| 205 |
|
|---|
| 206 | unset undef ; set ""
|
|---|
| 207 |
|
|---|
| 208 | expect '<>'
|
|---|
| 209 | recho ${undef-"$*"}
|
|---|
| 210 | expect '<xy>'
|
|---|
| 211 | recho ${undef-"x$*y"}
|
|---|
| 212 | expect '<xy>'
|
|---|
| 213 | recho ${undef-"$*xy"}
|
|---|
| 214 | expect '<xy>'
|
|---|
| 215 | recho ${undef-"xy$*"}
|
|---|
| 216 | expect '<xy>'
|
|---|
| 217 | recho ${undef-x"$*"y}
|
|---|
| 218 | expect '<xy>'
|
|---|
| 219 | recho ${undef-xy"$*"}
|
|---|
| 220 | expect '<xy>'
|
|---|
| 221 | recho ${undef-"$*"xy}
|
|---|
| 222 | expect '<>'
|
|---|
| 223 | recho "${undef-$*}"
|
|---|
| 224 | expect nothing
|
|---|
| 225 | recho ${undef-$*}
|
|---|
| 226 |
|
|---|
| 227 | expect '<>'
|
|---|
| 228 | recho ${undef-"$zzz"}
|
|---|
| 229 | expect '<x>'
|
|---|
| 230 | recho x${undef-"$zzz"}
|
|---|
| 231 | expect '<x>'
|
|---|
| 232 | recho x${undef-"$@"}
|
|---|
| 233 | expect nothing
|
|---|
| 234 | recho ${undef-"$@"}
|
|---|
| 235 | expect '<x>'
|
|---|
| 236 | recho ${undef-"$zzz"}x
|
|---|
| 237 | expect '<x>'
|
|---|
| 238 | recho ${undef-"$@"}x
|
|---|
| 239 | expect '<x>'
|
|---|
| 240 | recho "$@"x
|
|---|
| 241 | expect '<x>'
|
|---|
| 242 | recho "$zzz"x
|
|---|
| 243 | expect '<^?>'
|
|---|
| 244 | recho ${undef-}
|
|---|
| 245 | expect '<^?>'
|
|---|
| 246 | recho ${undef-""}
|
|---|
| 247 |
|
|---|
| 248 | yyy=""
|
|---|
| 249 | recho "$xxx"x
|
|---|
| 250 | recho "$yyy"x
|
|---|
| 251 |
|
|---|
| 252 | set "" "abd" ""
|
|---|
| 253 | recho "$@"x
|
|---|
| 254 | recho "$@"$xxx
|
|---|
| 255 |
|
|---|
| 256 | OIFS="$IFS"
|
|---|
| 257 |
|
|---|
| 258 | arg=a,b,c,d,e,f
|
|---|
| 259 |
|
|---|
| 260 | IFS=,
|
|---|
| 261 |
|
|---|
| 262 | export z=$arg
|
|---|
| 263 |
|
|---|
| 264 | eval z1=\"$arg\"
|
|---|
| 265 |
|
|---|
| 266 | IFS="$OIFS"
|
|---|
| 267 |
|
|---|
| 268 | recho $z
|
|---|
| 269 | recho $z1
|
|---|
| 270 |
|
|---|
| 271 | # should give an error
|
|---|
| 272 | abc\=def
|
|---|
| 273 |
|
|---|
| 274 | zz="a b c d e"
|
|---|
| 275 | declare a=$zz
|
|---|
| 276 |
|
|---|
| 277 | recho "$a"
|
|---|
| 278 | recho $a
|
|---|
| 279 |
|
|---|
| 280 | recho $(echo "foo$(echo ")")")
|
|---|
| 281 |
|
|---|
| 282 | # test backslash escapes
|
|---|
| 283 |
|
|---|
| 284 | recho \a
|
|---|
| 285 | recho \\a
|
|---|
| 286 |
|
|---|
| 287 | recho "\a"
|
|---|
| 288 | recho "\\a"
|
|---|
| 289 |
|
|---|
| 290 | recho '\a'
|
|---|
| 291 | recho '\\a'
|
|---|
| 292 |
|
|---|
| 293 | recho $(zecho \a)
|
|---|
| 294 | recho $(zecho \\a)
|
|---|
| 295 |
|
|---|
| 296 | recho $(zecho "\a")
|
|---|
| 297 | recho $(zecho "\\a")
|
|---|
| 298 |
|
|---|
| 299 | recho $(zecho '\a')
|
|---|
| 300 | recho $(zecho '\\a')
|
|---|
| 301 |
|
|---|
| 302 | recho `zecho \a`
|
|---|
| 303 | recho `zecho \\a`
|
|---|
| 304 |
|
|---|
| 305 | recho `zecho "\a"`
|
|---|
| 306 | recho `zecho "\\a"`
|
|---|
| 307 |
|
|---|
| 308 | recho `zecho '\a'`
|
|---|
| 309 | recho `zecho '\\a'`
|
|---|
| 310 |
|
|---|
| 311 | a=foo
|
|---|
| 312 |
|
|---|
| 313 | recho \$a
|
|---|
| 314 | recho \\$a
|
|---|
| 315 |
|
|---|
| 316 | recho "\$a"
|
|---|
| 317 | recho "\\$a"
|
|---|
| 318 |
|
|---|
| 319 | recho '\$a'
|
|---|
| 320 | recho '\\$a'
|
|---|
| 321 |
|
|---|
| 322 | recho $(zecho `zecho \a`)
|
|---|
| 323 | recho $(zecho `zecho \\a`)
|
|---|
| 324 |
|
|---|
| 325 | recho $(zecho `zecho "\a"`)
|
|---|
| 326 | recho $(zecho `zecho "\\a"`)
|
|---|
| 327 |
|
|---|
| 328 | recho $(zecho `zecho '\a'`)
|
|---|
| 329 | recho $(zecho `zecho '\\a'`)
|
|---|
| 330 |
|
|---|
| 331 | # should echo G { I K }
|
|---|
| 332 | recho ${abc:-G { I } K }
|
|---|
| 333 |
|
|---|
| 334 | abc=hi
|
|---|
| 335 |
|
|---|
| 336 | # should echo hi K }
|
|---|
| 337 | recho ${abc:-G { I } K }
|
|---|
| 338 |
|
|---|
| 339 | # should echo a*
|
|---|
| 340 | unset foo
|
|---|
| 341 | recho "${foo:-"a"}*"
|
|---|
| 342 |
|
|---|
| 343 | f ()
|
|---|
| 344 | {
|
|---|
| 345 | echo "Number of args: $#"
|
|---|
| 346 | echo "<\${*-x}>: <${*-x}>"
|
|---|
| 347 | echo "<\${@-x}>: <${@-x}>"
|
|---|
| 348 | }
|
|---|
| 349 |
|
|---|
| 350 | f
|
|---|
| 351 | f ''
|
|---|
| 352 | f '' ''
|
|---|
| 353 |
|
|---|
| 354 | set 1 2 3 4 5
|
|---|
| 355 |
|
|---|
| 356 | expect '<5>'
|
|---|
| 357 | recho ${#}
|
|---|
| 358 | expect '<5>'
|
|---|
| 359 | recho ${#:foo}
|
|---|
| 360 | expect '<5>'
|
|---|
| 361 | recho ${#:-foo}
|
|---|
| 362 | expect '<5>'
|
|---|
| 363 | recho ${#-posparams}
|
|---|
| 364 | expect '<5>'
|
|---|
| 365 | recho ${#:-posparams}
|
|---|
| 366 |
|
|---|
| 367 | expect '<0>'
|
|---|
| 368 | recho ${#!}
|
|---|
| 369 |
|
|---|
| 370 | expect nothing
|
|---|
| 371 | recho $!
|
|---|
| 372 | expect nothing
|
|---|
| 373 | recho ${!}
|
|---|
| 374 |
|
|---|
| 375 | expect nothing
|
|---|
| 376 | recho $8
|
|---|
| 377 | expect nothing
|
|---|
| 378 | recho ${8}
|
|---|
| 379 |
|
|---|
| 380 | shift $#
|
|---|
| 381 |
|
|---|
| 382 | expect '<0>'
|
|---|
| 383 | recho ${#}
|
|---|
| 384 | expect '<0>'
|
|---|
| 385 | recho ${#:foo}
|
|---|
| 386 | expect '<0>'
|
|---|
| 387 | recho ${#:-foo}
|
|---|
| 388 | expect '<0>'
|
|---|
| 389 | recho ${#-posparams}
|
|---|
| 390 | expect '<0>'
|
|---|
| 391 | recho ${#:-posparams}
|
|---|
| 392 |
|
|---|
| 393 | expect '<posparams>'
|
|---|
| 394 | recho ${!-posparams}
|
|---|
| 395 | expect '<posparams>'
|
|---|
| 396 | recho ${!:-posparams}
|
|---|
| 397 |
|
|---|
| 398 | expect '<2>'
|
|---|
| 399 | recho ${#-}
|
|---|
| 400 |
|
|---|
| 401 | expect '<0>'
|
|---|
| 402 | recho ${#-posparams}
|
|---|
| 403 |
|
|---|
| 404 | expect '<0>'
|
|---|
| 405 | recho ${#?:-xyz}
|
|---|
| 406 |
|
|---|
| 407 | expect '<1>'
|
|---|
| 408 | recho ${#?}
|
|---|
| 409 |
|
|---|
| 410 | set a b c d e
|
|---|
| 411 |
|
|---|
| 412 | expect '<5>'
|
|---|
| 413 | recho ${#}
|
|---|
| 414 | expect '<5>'
|
|---|
| 415 | recho ${#?:-xyz}
|
|---|
| 416 |
|
|---|
| 417 | shift $#
|
|---|
| 418 |
|
|---|
| 419 | expect '<0>'
|
|---|
| 420 | recho ${#:-foo}
|
|---|
| 421 |
|
|---|
| 422 | expect a bad substitution error
|
|---|
| 423 | recho ${#:}
|
|---|
| 424 | expect a bad substitution error
|
|---|
| 425 | recho ${#/}
|
|---|
| 426 | expect a bad substitution error
|
|---|
| 427 | recho ${#%}
|
|---|
| 428 | expect a bad substitution error
|
|---|
| 429 | recho ${#=}
|
|---|
| 430 | expect a bad substitution error
|
|---|
| 431 | recho ${#+}
|
|---|
| 432 | expect a bad substitution error
|
|---|
| 433 | recho ${#1xyz}
|
|---|
| 434 |
|
|---|
| 435 | expect a math syntax error
|
|---|
| 436 | recho ${#:%}
|
|---|
| 437 |
|
|---|
| 438 | expect '<0>'
|
|---|
| 439 | recho ${#:-}
|
|---|
| 440 |
|
|---|
| 441 | set --
|
|---|
| 442 | unset a b
|
|---|
| 443 |
|
|---|
| 444 | x=a
|
|---|
| 445 | y=b
|
|---|
| 446 |
|
|---|
| 447 | IFS=+
|
|---|
| 448 |
|
|---|
| 449 | expect '<a+b>'
|
|---|
| 450 | recho $x+$y
|
|---|
| 451 | expect '<+>'
|
|---|
| 452 | recho $a+$b
|
|---|
| 453 |
|
|---|
| 454 | expect '<+>'
|
|---|
| 455 | recho + "$@"
|
|---|
| 456 | expect '<+>'
|
|---|
| 457 | recho +"$@"
|
|---|
| 458 |
|
|---|
| 459 | # variants of nested curly braces inside ${...} expressions
|
|---|
| 460 |
|
|---|
| 461 | # IFS is not the standard one
|
|---|
| 462 |
|
|---|
| 463 | expect '<G { I>' '<K>' '<}>'
|
|---|
| 464 | recho ${gik:-G { I } K }
|
|---|
| 465 |
|
|---|
| 466 | abc=hi
|
|---|
| 467 |
|
|---|
| 468 | expect '<hi>' '<K>' '<}>'
|
|---|
| 469 | recho ${abc:-G { I } K }
|
|---|
| 470 |
|
|---|
| 471 | # reset IFS to the default
|
|---|
| 472 | IFS='
|
|---|
| 473 | '
|
|---|
| 474 |
|
|---|
| 475 | # nested ${...} inside ${...} are handled specially
|
|---|
| 476 | unset XXX FOO BAR
|
|---|
| 477 | expect '<xxx>' '<yyy>'
|
|---|
| 478 | XXX=xxx
|
|---|
| 479 | FOO=${BAR:-${XXX} yyy}
|
|---|
| 480 | recho $FOO
|
|---|
| 481 |
|
|---|
| 482 | # this was a bug in versions of bash prior to bash-2.04-release
|
|---|
| 483 | set -- ''
|
|---|
| 484 | expect 1
|
|---|
| 485 | echo $#
|
|---|
| 486 | expect '<>'
|
|---|
| 487 | recho "${@}"
|
|---|
| 488 | expect '<>'
|
|---|
| 489 | recho "${@-}"
|
|---|
| 490 | expect '<>'
|
|---|
| 491 | recho "${@:-}"
|
|---|
| 492 |
|
|---|
| 493 | # this was a bug in bash-2.04, fixed in 2.05
|
|---|
| 494 | set -- a b
|
|---|
| 495 | expect '<:a:>' '<:b:>'
|
|---|
| 496 | for i in "${@-}"; do recho :$i:; done
|
|---|
| 497 |
|
|---|
| 498 | # I believe that ksh93 does these wrong -- we're using the rhs, so shouldn't
|
|---|
| 499 | # it behave the same as ""?
|
|---|
| 500 | set --
|
|---|
| 501 | expect '<>'
|
|---|
| 502 | recho "${@-}"
|
|---|
| 503 | expect '<>'
|
|---|
| 504 | recho "${@:-}"
|
|---|