# # test the shell globbing # expect() { echo expect "$@" } TESTDIR=/tmp/glob-test mkdir $TESTDIR builtin cd $TESTDIR || { echo $0: cannot cd to $TESTDIR >&2 ; exit 1; } rm -rf * touch a b c d abc abd abe bb bcd ca cb dd de mkdir bdir # see if `regular' globbing works right expect ' ' recho a* X* expect ' ' recho \a* # see if null glob expansion works shopt -s nullglob expect ' ' recho a* X* shopt -u nullglob # see if the code that expands directories only works expect '' recho b*/ # Test quoted and unquoted globbing characters expect '<*>' recho \* expect '' recho 'a*' expect '' recho a\* expect ' <*q*>' recho c* a\* *q* expect '<**>' recho "*"* expect '<**>' recho \** expect '<\.\./*/>' recho "\.\./*/" expect '' recho 's/\..*//' # Pattern from Larry Wall's Configure that caused bash to blow up expect '' recho "/^root:/{s/^[^:]*:[^:]*:\([^:]*\).*"'$'"/\1/" # Make sure character classes work properly expect ' ' recho [a-c]b* expect '
' recho [a-y]*[^c] expect ' ' recho a*[^c] touch a-b aXb expect ' ' recho a[X-]b touch .x .y expect '
' recho [^a-c]* # Make sure that filenames with embedded globbing characters are handled # properly mkdir a\*b > a\*b/ooo expect '' recho a\*b/* expect '' recho a\*?/* expect '' cmd='echo !7' case "$cmd" in *\\!*) echo match ;; *) echo no match ;; esac expect '' file='r.*' case $file in *.\*) echo not there ;; *) echo there ;; esac # examples from the Posix.2 spec (d11.2, p. 243) expect '' recho a[b]c expect '' recho a["b"]c expect '' recho a[\b]c expect '' recho a?c expect '' case abc in a"b"c) echo match ;; *) echo BAD ;; esac expect '' case abc in a*c) echo match ;; *) echo BAD ;; esac expect '' case abc in "a?c") echo bad ;; *) echo ok ;; esac expect '' case abc in a\*c) echo bad ;; *) echo ok ;; esac expect '' case abc in a\[b]c) echo bad ;; *) echo ok ;; esac expect '' case "$nosuchvar" in "") echo ok ;; *) echo bad ;; esac # This is very odd, but sh and ksh seem to agree expect '' case abc in a["\b"]c) echo ok ;; *) echo bad ;; esac mkdir man mkdir man/man1 touch man/man1/bash.1 expect '' recho */man*/bash.* expect '' recho $(echo */man*/bash.*) expect '' recho "$(echo */man*/bash.*)" # tests with multiple `*'s case abc in a***c) echo ok 1;; esac case abc in a*****?c) echo ok 2;; esac case abc in ?*****??) echo ok 3;; esac case abc in *****??) echo ok 4;; esac case abc in *****??c) echo ok 5;; esac case abc in ?*****?c) echo ok 6;; esac case abc in ?***?****c) echo ok 7;; esac case abc in ?***?****?) echo ok 8;; esac case abc in ?***?****) echo ok 9;; esac case abc in *******c) echo ok 10;; esac case abc in *******?) echo ok 11;; esac case abcdecdhjk in a*cd**?**??k) echo ok 20;; esac case abcdecdhjk in a**?**cd**?**??k) echo ok 21;; esac case abcdecdhjk in a**?**cd**?**??k***) echo ok 22;; esac case abcdecdhjk in a**?**cd**?**??***k) echo ok 23;; esac case abcdecdhjk in a**?**cd**?**??***k**) echo ok 24;; esac case abcdecdhjk in a****c**?**??*****) echo ok 25;; esac # none of these should output anything case abc in ??**********?****?) echo bad ;; esac case abc in ??**********?****c) echo bad ;; esac case abc in ?************c****?****) echo bad;; esac case abc in *c*?**) echo bad;; esac case abc in a*****c*?**) echo bad;; esac case abc in a********???*******) echo bad;; esac builtin cd / rm -rf $TESTDIR exit 0