1#! test/for/moderni/sh 2# See the file LICENSE in the main modernish directory for the licence. 3 4# Tests for the positional parameters ($@ and $*). This is to discover any 5# shell bugs that modernish doesn't know about yet; the fact that modernish 6# doesn't know about it should be considered a bug in modernish. 7# 8# Most of these tests were inspired by the examples in the POSIX rationale, 9# section 2.5.2, Special Parameters: 10# http://pubs.opengroup.org/onlinepubs/9699919799/xrat/V4_xcu_chap02.html#tag_23_02_05_02 11# which is a supplement to the main spec: 12# http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_05_02 13 14# bug patterns for some bash bugs with control characters... 15CTRLs=$CC01$CC02$CC03$CC7F # no bug 16CTRLs_BUG_PP_10=$CC02$CC03 17CTRLs_BUG_PP_10A=$CC01$CC01$CC02$CC03$CC01$CC7F 18CTRLs_BUG_PSUBASNCC_unquoted=$CC02$CC03 19CTRLs_BUG_PSUBASNCC_quoted=$CC02$CC03$CC7F 20 21TEST title='$*, IFS is space' 22 set "abc" "def ghi" "$CTRLs" 23 IFS=' ' 24 set $* 25 IFS= 26 eq $# 4 && str eq "$1|$2|$3|$4" "abc|def|ghi|$CTRLs" 27ENDT 28 29TEST title='"$*", IFS is space' 30 set "abc" "def ghi" "$CTRLs" 31 IFS=' ' 32 set "$*" 33 IFS= 34 eq $# 1 && str eq "$1" "abc def ghi $CTRLs" 35ENDT 36 37TEST title='$* concatenated, IFS is space' 38 set "abc" "def ghi" "$CTRLs" 39 IFS=' ' 40 set xx$*yy 41 IFS= 42 eq $# 4 && str eq "$1|$2|$3|$4" "xxabc|def|ghi|${CTRLs}yy" 43ENDT 44 45TEST title='"$*" concatenated, IFS is space' 46 set "abc" "def ghi" "$CTRLs" 47 IFS=' ' 48 set "xx$*yy" 49 IFS= 50 eq $# 1 && str eq "$1" "xxabc def ghi ${CTRLs}yy" 51ENDT 52 53TEST title='$@, IFS is space' 54 set "abc" "def ghi" "$CTRLs" 55 IFS=' ' 56 set $@ 57 IFS= 58 case ${#},${1-},${2-},${3-},${4-NONE} in 59 ( "4,abc,def,ghi,$CTRLs" ) 60 mustNotHave BUG_PP_06 ;; 61 ( "3,abc,def ghi,$CTRLs,NONE" ) 62 mustHave BUG_PP_06 ;; 63 ( * ) return 1 ;; 64 esac 65ENDT 66 67TEST title='$@, IFS set/empty' 68 set "abc" "def ghi" "$CTRLs" 69 IFS= 70 set $@ 71 case ${#},${1-},${2-NONE},${3-NONE} in 72 ( "3,abc,def ghi,$CTRLs" ) 73 mustNotHave BUG_PP_08 ;; 74 ( "1,abcdef ghi$CTRLs,NONE,NONE" ) 75 mustHave BUG_PP_08 ;; 76 ( * ) return 1 ;; 77 esac 78ENDT 79 80TEST title='"$@", IFS set/empty' 81 set "abc" "def ghi" "$CTRLs" 82 IFS= 83 set "$@" 84 eq $# 3 && str eq "$1|$2|$3" "abc|def ghi|$CTRLs" 85ENDT 86 87TEST title='${1+"$@"}, IFS set/empty' 88 set "abc" "def ghi" "$CTRLs" 89 IFS= 90 set ${1+"$@"} 91 failmsg="$#|${1-}|${2-}|${3-}" 92 case ${#},${1-},${2-NONE},${3-NONE} in 93 ( "3,abc,def ghi,$CTRLs") 94 mustNotHave BUG_PP_1ARG ;; 95 ( "1,abcdef ghi$CTRLs,NONE,NONE" ) 96 mustHave BUG_PP_1ARG ;; 97 ( * ) return 1 ;; 98 esac 99ENDT 100 101 102TEST title='"${1+$@}", IFS set/empty' 103 set "abc" "def ghi" "$CTRLs" 104 IFS= 105 set "${1+$@}" 106 failmsg="$#|${1-}|${2-}|${3-}" 107 case ${#},${1-},${2-NONE},${3-NONE} in 108 ( "3,abc,def ghi,$CTRLs" ) 109 mustNotHave BUG_PP_1ARG ;; 110 ( "1,abcdef ghi$CTRLs,NONE,NONE" ) 111 mustHave BUG_PP_1ARG ;; 112 ( * ) return 1 ;; 113 esac 114ENDT 115 116TEST title='${novar-"$@"}, IFS set/empty' 117 set "abc" "def ghi" "$CTRLs" 118 unset -v novar 119 IFS= 120 set ${novar-"$@"} 121 case ${#},${1-},${2-NONE},${3-NONE} in 122 ( "3,abc,def ghi,$CTRLs") 123 mustNotHave BUG_PP_1ARG ;; 124 ( "1,abcdef ghi$CTRLs,NONE,NONE" ) 125 mustHave BUG_PP_1ARG ;; 126 ( * ) return 1 ;; 127 esac 128ENDT 129 130TEST title='$@ concatenated, IFS is space' 131 set "abc" "def ghi" "$CTRLs" 132 IFS=' ' 133 set xx$@yy 134 IFS= 135 case ${#},${1-},${2-},${3-},${4-NONE} in 136 ( "4,xxabc,def,ghi,${CTRLs}yy" ) 137 mustNotHave BUG_PP_06 ;; 138 ( "3,xxabc,def ghi,${CTRLs}yy,NONE" ) 139 mustHave BUG_PP_06 ;; 140 ( * ) return 1 ;; 141 esac 142ENDT 143 144TEST title='"$@" concatenated, IFS set/empty' 145 set "abc" "def ghi" "$CTRLs" 146 set "xx$@yy" 147 eq $# 3 && str eq "$1|$2|$3" "xxabc|def ghi|${CTRLs}yy" 148ENDT 149 150TEST title='$@$@, IFS is space' 151 set "abc" "def ghi" "$CTRLs" 152 IFS=' ' 153 set $@$@ 154 IFS= 155 case ${#},${1-},${2-},${3-},${4-},${5-},${6-NONE},${7-NONE} in 156 ( "7,abc,def,ghi,${CTRLs}abc,def,ghi,$CTRLs" ) 157 mustNotHave BUG_PP_06 ;; 158 ( "5,abc,def ghi,${CTRLs}abc,def ghi,$CTRLs,NONE,NONE" ) 159 mustHave BUG_PP_06 ;; 160 ( * ) return 1 ;; 161 esac 162ENDT 163 164TEST title='"$@$@", IFS set/empty' 165 set "abc" "def ghi" "$CTRLs" 166 set "$@$@" 167 eq $# 5 && str eq "$1|$2|$3|$4|$5" "abc|def ghi|${CTRLs}abc|def ghi|$CTRLs" 168ENDT 169 170# ... IFS=":" ... 171 172TEST title='"$*", IFS is ":"' 173 set "abc" "def ghi" "$CTRLs" 174 IFS=':' 175 set "$*" 176 IFS= 177 eq $# 1 && str eq "$1" "abc:def ghi:$CTRLs" 178ENDT 179 180TEST title='var=$*, IFS is ":"' 181 set "abc" "def ghi" "jkl" 182 IFS=':' 183 var=$* 184 IFS= 185 str eq "$var" "abc:def ghi:jkl" || return 186 187 set -- "$ASCIICHARS" "$ASCIICHARS" "$ASCIICHARS" 188 IFS=':' 189 var=$* 190 IFS= 191 v=$CC01${CONTROLCHARS%$CC7F}$CC01$CC7F${ASCIICHARS#$CONTROLCHARS} 192 case $var in 193 ( "$v:$v:$v" ) 194 mustHave BUG_PP_10A ;; 195 ( "$ASCIICHARS:$ASCIICHARS:$ASCIICHARS" ) 196 mustNotHave BUG_PP_10A ;; 197 ( * ) return 1 ;; 198 esac 199ENDT 200 201TEST title='var="$*", IFS is ":"' 202 set "abc" "def ghi" "$CTRLs" 203 IFS=':' 204 var="$*" 205 IFS= 206 str eq "$var" "abc:def ghi:$CTRLs" 207ENDT 208 209TEST title='${var-$*}, IFS is ":"' 210 set "abc" "def ghi" "$CTRLs" 211 unset -v var 212 IFS=':' 213 set ${var-$*} 214 IFS= 215 case ${#},${1-},${2-NONE},${3-NONE} in 216 ( "3,abc,def ghi,$CTRLs" ) 217 mustNotHave BUG_PP_09 ;; 218 ( "1,abc def ghi $CTRLs,NONE,NONE" ) 219 mustHave BUG_PP_09 ;; # bash 4.3 220 ( * ) return 1 ;; 221 esac 222ENDT 223 224TEST title='"${var-$*}", IFS is ":"' 225 set "abc" "def ghi" "$CTRLs" 226 unset -v var 227 IFS=':' 228 set "${var-$*}" 229 IFS= 230 eq $# 1 && str eq "$1" "abc:def ghi:$CTRLs" 231ENDT 232 233TEST title='${var-"$*"}, IFS is ":"' 234 set "abc" "def ghi" "$CTRLs" 235 unset -v var 236 IFS=':' 237 set ${var-"$*"} 238 IFS= 239 eq $# 1 && str eq "$1" "abc:def ghi:$CTRLs" 240ENDT 241 242TEST title='${var=$*}, IFS is ":"' 243 set "abc" "def ghi" "$CTRLs" 244 unset -v var 245 IFS=':' 246 set ${var=$*} 247 IFS= 248 case ${#},${1-},${2-NONE},${3-NONE},var=$var in 249 ( "3,abc,def ghi,$CTRLs,var=abc:def ghi:$CTRLs" ) 250 mustNotHave BUG_PP_04E && mustNotHave BUG_PSUBASNCC ;; 251 ( "3,abc,def ghi,$CTRLs_BUG_PSUBASNCC_unquoted,var=abc:def ghi:$CTRLs" ) 252 mustNotHave BUG_PP_04E && mustHave BUG_PSUBASNCC ;; # bash 4.2, 4.4 253 ( "1,abc def ghi $CTRLs_BUG_PSUBASNCC_unquoted,NONE,NONE,var=abc def ghi $CTRLs" ) 254 mustHave BUG_PP_04E 255 eq $? 2 && mustHave BUG_PSUBASNCC ;; # bash 4.3 256 ( * ) return 1 ;; 257 esac 258ENDT 259 260TEST title='"${var=$*}", IFS is ":"' 261 set "abc" "def ghi" "$CTRLs" 262 unset -v var 263 IFS=':' 264 set "${var=$*}" 265 IFS= 266 case ${#},$1\|var=$var in 267 ( "1,abc:def ghi:$CTRLs|var=abc:def ghi:$CTRLs" ) 268 mustNotHave BUG_PSUBASNCC ;; 269 ( "3,abc:def ghi:$CTRLs_BUG_PSUBASNCC_quoted|var=abc:def ghi:$CTRLs" ) 270 mustHave BUG_PSUBASNCC ;; 271 esac 272ENDT 273 274# ... IFS='' ... 275 276TEST title='var=$*, IFS set/empty' 277 set "abc" "$ASCIICHARS" "def ghi" "$ASCIICHARS" "jkl" 278 IFS= 279 var=$* 280 v=${CONTROLCHARS#$CC01} 281 v=${v%$CC7F}${ASCIICHARS#$CONTROLCHARS} 282 case $var in 283 ( "abc${ASCIICHARS}def ghi${ASCIICHARS}jkl" ) 284 mustNotHave BUG_PP_03 && mustNotHave BUG_PP_10 ;; 285 ( "abc${v}def ghi${v}jkl" ) 286 mustNotHave BUG_PP_03 && mustHave BUG_PP_10 ;; 287 ( "abc" ) 288 mustNotHave BUG_PP_10 && mustHave BUG_PP_03 ;; 289 ( * ) return 1 ;; 290 esac 291ENDT 292 293TEST title='var="$*", IFS set/empty' 294 set "abc" "$ASCIICHARS" "def ghi" "$ASCIICHARS" "jkl" 295 IFS= 296 var="$*" 297 str eq "$var" "abc${ASCIICHARS}def ghi${ASCIICHARS}jkl" 298ENDT 299 300TEST title='${var-$*}, IFS set/empty' 301 set "abc" "def ghi" "$CTRLs" 302 unset -v var 303 IFS= 304 set ${var-$*} 305 case ${#},${1-},${2-NONE},${3-NONE} in 306 ( "3,abc,def ghi,$CTRLs" ) 307 mustNotHave BUG_PP_08B && mustNotHave BUG_PSUBEMIFS ;; 308 ( "1,abcdef ghi$CC02$CC03,NONE,NONE" ) 309 mustHave BUG_PP_08B # bash 4.4 310 eq $? 2 && mustHave BUG_PSUBEMIFS ;; 311 ( "1,abcdef ghi$CTRLs,NONE,NONE" | "1,abc def ghi $CTRLs,NONE,NONE" ) 312 mustNotHave BUG_PSUBEMIFS && mustHave BUG_PP_08B ;; # bash | pdksh/bosh 313 ( * ) return 1 ;; 314 esac 315ENDT 316 317TEST title='"${var-$*}", IFS set/empty' 318 set "abc" "def ghi" "$CTRLs" 319 unset -v var 320 IFS= 321 set "${var-$*}" 322 eq $# 1 && str eq "$1" "abcdef ghi$CTRLs" 323ENDT 324 325TEST title='${var-"$*"}, IFS set/empty' 326 set "abc" "def ghi" "$CTRLs" 327 unset -v var 328 IFS= 329 set ${var-"$*"} 330 eq $# 1 && str eq "$1" "abcdef ghi$CTRLs" 331ENDT 332 333TEST title='${var=$*}, IFS set/empty' 334 set "abc" "def ghi" "$CTRLs" 335 unset -v var 336 IFS= 337 set ${var=$*} 338 v=${#},${1-},${2-NONE},${3-NONE},var=$var 339 case $v in 340 ( "1,abcdef ghi$CTRLs,NONE,NONE,var=abcdef ghi$CTRLs" ) 341 mustNotHave BUG_PP_04 && mustNotHave BUG_PP_04_S && mustNotHave BUG_PSUBASNCC ;; 342 ( "3,abc,def ghi,$CTRLs,var=$CTRLs" ) 343 mustNotHave BUG_PP_04_S && mustNotHave BUG_PSUBASNCC && mustHave BUG_PP_04 ;; # pdksh/mksh 344 ( "2,abcdef,ghi$CTRLs_BUG_PSUBASNCC_unquoted,NONE,var=abcdef ghi$CTRLs" ) 345 mustNotHave BUG_PP_04 && mustHave BUG_PP_04_S # bash 4.2, 4.3 346 eq $? 2 && mustHave BUG_PSUBASNCC ;; 347 ( "1,abcdef ghi$CTRLs_BUG_PSUBASNCC_unquoted,NONE,NONE,var=abcdef ghi$CTRLs_BUG_PSUBASNCC_quoted" ) 348 mustNotHave BUG_PP_04 && mustNotHave BUG_PP_04_S && mustHave BUG_PSUBASNCC ;; # bash 4.4 349 ( * ) return 1 ;; 350 esac 351ENDT 352 353TEST title='"${var=$*}", IFS set/empty' 354 set "abc" "def ghi" "$CTRLs" 355 unset -v var 356 IFS= 357 set "${var=$*}" 358 case $#,$1\|var=$var in 359 ( "1,abcdef ghi$CTRLs|var=abcdef ghi$CTRLs" ) 360 mustNotHave BUG_PSUBASNCC ;; 361 ( "1,abcdef ghi$CTRLs_BUG_PSUBASNCC_quoted|var=abcdef ghi$CTRLs" ) 362 mustHave BUG_PSUBASNCC ;; 363 esac 364ENDT 365 366# ... IFS unset ... 367 368TEST title='"$*", IFS unset' 369 set "abc" "def ghi" "$CTRLs" 370 unset -v IFS 371 set "$*" 372 IFS= 373 eq $# 1 && str eq "$1" "abc def ghi $CTRLs" 374ENDT 375 376TEST title='var=$*, IFS unset' 377 set "abc" "def ghi" "$CTRLs" 378 unset -v IFS 379 var=$* 380 IFS= 381 case $var in 382 ( "abc def ghi $CTRLs" ) 383 # *may* have BUG_PP_03 variant with set & empty IFS (mksh) 384 ;; 385 ( 'abc' ) 386 mustHave BUG_PP_03 ;; 387 ( * ) return 1 ;; 388 esac 389ENDT 390 391TEST title='var="$*", IFS unset' 392 set "abc" "def ghi" "$CTRLs" 393 unset -v IFS 394 var="$*" 395 IFS= 396 str eq "$var" "abc def ghi $CTRLs" 397ENDT 398 399TEST title='${var-$*}, IFS unset' 400 set "abc" "def ghi" "$CTRLs" 401 unset -v var 402 unset -v IFS 403 set ${var-$*} 404 IFS= 405 case ${#},${1-},${2-},${3-},${4-NONE} in 406 ( "4,abc,def,ghi,$CTRLs" ) 407 mustNotHave BUG_PP_07 ;; 408 ( "3,abc,def ghi,$CTRLs,NONE" ) 409 mustHave BUG_PP_07 ;; # zsh 410 ( * ) return 1 ;; 411 esac 412ENDT 413 414TEST title='"${var-$*}", IFS unset' 415 set "abc" "def ghi" "$CTRLs" 416 unset -v var 417 unset -v IFS 418 set "${var-$*}" 419 IFS= 420 eq $# 1 && str eq "$1" "abc def ghi $CTRLs" 421ENDT 422 423TEST title='${var-"$*"}, IFS unset' 424 set "abc" "def ghi" "$CTRLs" 425 unset -v var 426 unset -v IFS 427 set ${var-"$*"} 428 IFS= 429 eq $# 1 && str eq "$1" "abc def ghi $CTRLs" 430ENDT 431 432TEST title='${var=$*}, IFS unset' 433 set "abc" "def ghi" "$CTRLs" 434 unset -v var 435 unset -v IFS 436 set ${var=$*} 437 IFS= 438 case $#,$1\|$2\|$3\|$4\|var=$var in 439 ( "4,abc|def|ghi|$CTRLs|var=abc def ghi $CTRLs" ) 440 mustNotHave BUG_PSUBASNCC ;; 441 ( "4,abc|def|ghi|$CTRLs_BUG_PSUBASNCC_unquoted|var=abc def ghi $CTRLs" ) 442 mustHave BUG_PSUBASNCC ;; 443 esac 444ENDT 445 446TEST title='"${var=$*}", IFS unset' 447 set "abc" "def ghi" "$CTRLs" 448 unset -v var 449 unset -v IFS 450 set "${var=$*}" 451 IFS= 452 case $#,$1\|var=$var in 453 ( "1,abc def ghi $CTRLs|var=abc def ghi $CTRLs" ) 454 mustNotHave BUG_PSUBASNCC ;; 455 ( "1,abc def ghi $CTRLs_BUG_PSUBASNCC_quoted|var=abc def ghi $CTRLs" ) 456 mustHave BUG_PSUBASNCC ;; 457 esac 458ENDT 459 460TEST title='"$@", IFS unset' 461 set "abc" "def ghi" "$CTRLs" 462 unset -v IFS 463 set "$@" 464 IFS= 465 eq $# 3 && str eq "$1|$2|$3" "abc|def ghi|$CTRLs" 466ENDT 467 468# ...empty fields... 469 470TEST title='$* with empty field, IFS unset' 471 set "one" "" "three" 472 unset -v IFS 473 set $* 474 IFS= 475 case ${#},${1-},${2-},${3-NONE} in 476 ( '2,one,three,NONE' ) 477 mustNotHave QRK_EMPTPPFLD ;; 478 ( '3,one,,three' ) 479 mustHave QRK_EMPTPPFLD ;; 480 ( * ) return 1 ;; 481 esac 482ENDT 483 484TEST title='$@ with empty field, IFS unset' 485 set "one" "" "three" 486 unset -v IFS 487 set $@ 488 IFS= 489 case ${#},${1-},${2-},${3-NONE} in 490 ( '2,one,three,NONE' ) 491 mustNotHave QRK_EMPTPPFLD ;; 492 ( '3,one,,three' ) 493 mustHave QRK_EMPTPPFLD ;; 494 ( * ) return 1 ;; 495 esac 496ENDT 497 498# ...concatenating empty PPs... 499 500TEST title='empty "$*", IFS set/empty' 501 set -- 502 IFS= 503 set foo "$*" 504 eq $# 2 && str eq "$1|$2" "foo|" 505ENDT 506 507TEST title='empty "${novar-}$*$(:)", IFS set/empty' 508 set -- 509 unset -v novar 510 IFS= 511 set foo "${novar-}$*$(:)" 512 eq $# 2 && str eq "$1|$2" "foo|" 513ENDT 514 515TEST title='empty $@ and $*, IFS set/empty' 516 set -- 517 IFS= 518 set foo $@ $* 519 set $@ $* 520 set $@ $* 521 case ${#},${1-},${2-U},${3-U},${4-U},${5-U},${6-U},${7-U},${8-U},${9-U},${10-U},${11-U},${12-U} in 522 ( '4,foo,foo,foo,foo,U,U,U,U,U,U,U,U' ) 523 mustNotHave BUG_PP_05 && mustNotHave BUG_PP_08 ;; 524 ( '12,foo,,,foo,,,foo,,,foo,,' ) 525 mustNotHave BUG_PP_08 && mustHave BUG_PP_05 ;; 526 ( '2,foofoo,foofoo,U,U,U,U,U,U,U,U,U,U' ) 527 mustNotHave BUG_PP_05 && mustHave BUG_PP_08 ;; 528 ( * ) return 1 ;; 529 esac 530ENDT 531 532TEST title='empty "$@", IFS set/empty' 533 set -- 534 IFS= 535 set foo "$@" 536 eq $# 1 537ENDT 538 539TEST title="empty ''\$@, IFS set/empty" 540 set -- 541 IFS= 542 set foo ''$@ 543 case ${#},${1-},${2-NONE} in 544 ( '2,foo,' ) 545 mustNotHave BUG_PP_02 ;; 546 ( '1,foo,NONE' ) 547 mustHave BUG_PP_02 ;; 548 ( * ) return 1 ;; 549 esac 550ENDT 551 552TEST title="empty ''\"\$@\", IFS set/empty" 553 set -- 554 IFS= 555 set foo ''"$@" 556 case ${#},${1-},${2-NONE} in 557 ( '2,foo,' ) 558 mustNotHave BUG_PP_01 ;; 559 ( '1,foo,NONE' ) 560 mustHave BUG_PP_01 ;; 561 ( * ) return 1 ;; 562 esac 563ENDT 564 565TEST title='empty "${novar-}$@$(:)", IFS set/empty' 566 set -- 567 unset -v novar 568 IFS= 569 set foo "${novar-}$@$(:)" 570 case ${#},${1-},${2-NONE} in 571 ( '2,foo,' ) 572 mustNotHave QRK_EMPTPPWRD ;; 573 ( '1,foo,NONE' ) 574 mustHave QRK_EMPTPPWRD ;; 575 ( * ) return 1 ;; 576 esac 577ENDT 578 579TEST title='empty '\'\''"${novar-}$@$(:)", IFS set/empty' 580 set -- 581 unset -v novar 582 IFS= 583 set foo ''"${novar-}$@$(:)" 584 case ${#},${1-},${2-NONE} in 585 ( '2,foo,' ) 586 mustNotHave BUG_PP_01 ;; 587 ( '1,foo,NONE' ) 588 mustHave BUG_PP_01 ;; 589 ( * ) return 1 ;; 590 esac 591ENDT 592 593# ... shell grammar parsing ... 594 595TEST title='correct parsing of $#' 596 set 1 2 3 597 foo=$$ 598 case $#$foo,$(($#-1+1)) in 599 ( "3$foo,3" ) 600 ;; 601 ( "${#foo}foo,${#-}2" | "${#foo}foo,2" ) 602 failmsg=FTL_HASHVAR; return 1 ;; 603 ( * ) return 1 ;; 604 esac 605ENDT 606 607TEST title='quoting $* quotes IFS wildcards (1)' 608 IFS=* # on bash < 4.4, BUG_IFSGLOBC now breaks 'case' and hence all of modernish 609 set "abc" "def ghi" "$CTRLs" 610 case abcFOOBARdef\ ghiBAZQUX$CTRLs in 611 ("$*") IFS=; mustHave BUG_IFSGLOBS; return ;; # ksh93 612 ( * ) IFS=; mustNotHave BUG_IFSGLOBS; return ;; 613 esac 614 # if not even '*' matched, we've got BUG_IFSGLOBC 615 IFS= # unbreak modernish on bash < 4.4 616 mustNotHave BUG_IFSGLOBS && mustHave BUG_IFSGLOBC 617ENDT 618 619TEST title='quoting $* quotes IFS wildcards (2)' 620 IFS=* # on bash < 4.4, BUG_IFSGLOBC now breaks 'case' and hence all of modernish 621 set "abc" "def ghi" "$CTRLs" 622 v=abcFOOBARdef\ ghiBAZQUX${CTRLs}BUG 623 v=${v#"$*"} 624 IFS= # unbreak modernish on bash < 4.4 625 case $v in 626 ( BUG ) mustHave BUG_IFSGLOBS; return ;; 627 ( abcFOOBARdef\ ghiBAZQUX${CTRLs}BUG ) 628 mustNotHave BUG_IFSGLOBS; return ;; 629 esac 630 return 1 631ENDT 632 633TEST title='quoted "$@" expansion is indep. of IFS' 634 set "abc" "def ghi" "jkl" 635 IFS=$CC01 636 set "$@" 637 IFS=, 638 v="$*" 639 IFS= 640 if eq $# 1 && str eq $v "abc${CC01}def ghi${CC01}jkl"; then 641 mustHave BUG_IFSCC01PP # bash <= 3.2 642 elif eq $# 27 && str eq $v ",,a,,b,,c${CC7F},,d,,e,,f,, ,,g,,h,,i${CC7F},,j,,k,,l"; then 643 mustHave BUG_IFSCC01PP # bash 4.0 - 4.3 644 else 645 eq $# 3 && str eq $v "abc,def ghi,jkl" 646 fi 647ENDT 648 649TEST title='empty removal of unqoted nonexistent PPs' 650 set "a" "" 651 set +u 652 IFS= 653 # test nonempty (1), empty (2), and unset (3) PPs 654 set $1 ${1-} ${1:-} ${1+$1} ${1:+$1} $2 ${2-} ${2:-} ${2+$2} ${2:+$2} $3 ${3-} ${3:-} ${3+$3} ${3:+$3} 655 IFS=, 656 v="$*" 657 IFS= 658 set -u 659 case $v in 660 ( 'a,a,a,a,a' ) 661 mustNotHave BUG_PSUBEMPT ;; 662 ( 'a,a,a,a,a,,,' ) 663 mustHave BUG_PSUBEMPT ;; 664 ( * ) return 1 ;; 665 esac 666ENDT 667 668TEST title='multi-digit PPs require expansion braces' 669 set one 2 3 4 5 6 7 8 9 10 11 twelve 670 v=$12 671 case $v in 672 ( 'one2' ) 673 mustNotHave BUG_PP_MDIGIT ;; 674 ( 'twelve' ) 675 mustHave BUG_PP_MDIGIT ;; 676 ( * ) return 1 ;; 677 esac 678ENDT 679