1 2unset LC_ALL 3LC_COLLATE=C 4export LC_COLLATE 5 6failures=0 7 8check() { 9 testcase=$1 10 expect=$2 11 eval "set -- $testcase" 12 actual="$*" 13 if [ "$actual" != "$expect" ]; then 14 failures=$((failures+1)) 15 printf '%s\n' "For $testcase, expected $expect actual $actual" 16 fi 17} 18 19set -e 20T=$(mktemp -d ${TMPDIR:-/tmp}/sh-test.XXXXXX) 21trap 'rm -rf $T' 0 22cd -P $T 23 24mkdir testdir testdir2 'testdir/*' 'testdir/?' testdir/a testdir/b testdir2/b 25mkdir testdir2/.c 26touch testf 'testdir/*/1' 'testdir/?/1' testdir/a/1 testdir/b/1 testdir2/b/.a 27 28check '' '' 29check 'testdir/b' 'testdir/b' 30check 'testdir/c' 'testdir/c' 31check '\*' '*' 32check '\?' '?' 33check '*' 'testdir testdir2 testf' 34check '*""' 'testdir testdir2 testf' 35check '""*' 'testdir testdir2 testf' 36check '*/' 'testdir/ testdir2/' 37check 'testdir*/a' 'testdir/a' 38check 'testdir*/b' 'testdir/b testdir2/b' 39check '*/.c' 'testdir2/.c' 40check 'testdir2/*' 'testdir2/b' 41check 'testdir2/b/*' 'testdir2/b/*' 42check 'testdir/*' 'testdir/* testdir/? testdir/a testdir/b' 43check 'testdir/*/1' 'testdir/*/1 testdir/?/1 testdir/a/1 testdir/b/1' 44check '"testdir/"*/1' 'testdir/*/1 testdir/?/1 testdir/a/1 testdir/b/1' 45check 'testdir/\*/*' 'testdir/*/1' 46check 'testdir/\?/*' 'testdir/?/1' 47check 'testdir/"?"/*' 'testdir/?/1' 48check '"testdir"/"?"/*' 'testdir/?/1' 49check '"testdir"/"?"*/*' 'testdir/?/1' 50check '"testdir"/*"?"/*' 'testdir/?/1' 51check '"testdir/?"*/*' 'testdir/?/1' 52check 'testdir/\*/' 'testdir/*/' 53check 'testdir/\?/' 'testdir/?/' 54check 'testdir/"?"/' 'testdir/?/' 55check '"testdir"/"?"/' 'testdir/?/' 56check '"testdir"/"?"*/' 'testdir/?/' 57check '"testdir"/*"?"/' 'testdir/?/' 58check '"testdir/?"*/' 'testdir/?/' 59check 'testdir/[*]/' 'testdir/*/' 60check 'testdir/[?]/' 'testdir/?/' 61check 'testdir/[*?]/' 'testdir/*/ testdir/?/' 62check '[tz]estdir/[*]/' 'testdir/*/' 63 64exit $((failures != 0)) 65