# A test suite for the POSIX.2 (BRE) pattern matching code LC_ALL=C LANG=C # First, test POSIX.2 character classes case e in [[:xdigit:]]) echo ok 1;; esac case a in [[:alpha:]123]) echo ok 2;; esac case 1 in [[:alpha:]123]) echo ok 3;; esac case 9 in [![:alpha:]]) echo ok 4;; esac # invalid character class expressions are just characters to be matched case a in [:al:]) echo ok 5;; esac case a in [[:al:]) echo ok 6;; esac case '!' in [abc[:punct:][0-9]) echo ok 7;; esac # let's try to match the start of a valid sh identifier case 'PATH' in [_[:alpha:]]*) echo ok 8;; esac # let's try to match the first two characters of a valid sh identifier case PATH in [_[:alpha:]][_[:alnum:]]*) echo ok 9;; esac # is ^C a cntrl character? case $'\003' in [[:cntrl:]]) echo ok 10;; esac # how about A? case A in [[:cntrl:]]) echo oops -- cntrl ;; *) echo ok 11;; esac case 9 in [[:digit:]]) echo ok 12;; esac case X in [[:digit:]]) echo oops -- digit;; *) echo ok 13;; esac case $'\033' in [[:graph:]]) echo oops -- graph;; *) echo ok 14;; esac case $'\040' in [[:graph:]]) echo oops -- graph 2;; *) echo ok 15;; esac case ' ' in [[:graph:]]) echo oops -- graph 3;; *) echo ok 16;; esac case 'aB' in [[:lower:]][[:upper:]]) echo ok 17;; esac case $'\040' in [[:print:]]) echo ok 18;; *) echo oops -- print;; esac case PS3 in [_[:alpha:]][_[:alnum:]][_[:alnum:]]*) echo ok 19;; esac case a in [[:alpha:][:digit:]]) echo ok 20;; *) echo oops - skip brackpat ;; esac case a in [[:alpha:]\]) echo oops -- dangling backslash in brackpat ;; *) echo ok 21 ;; esac # what's a newline? is it a blank? a space? case $'\n' in [[:blank:]]) echo ok -- blank ;; [[:space:]]) echo ok -- space ;; *) echo oops newline ;; esac # OK, what's a tab? is it a blank? a space? case $'\t' in [[:blank:]]) echo ok -- blank ;; [[:space:]]) echo ok -- space ;; *) echo oops newline ;; esac # let's check out characters in the ASCII range case $'\377' in [[:ascii:]]) echo oops -- ascii\?;; esac case 9 in [1[:alpha:]123]) echo oops 1;; esac # however, an unterminated brace expression containing a valid char class # that matches had better fail case a in [[:alpha:]) echo oops 2;; esac case $'\b' in [[:graph:]]) echo oops 3;; esac case $'\b' in [[:print:]]) echo oops 4;; esac case $' ' in [[:punct:]]) echo oops 5;; esac # Next, test POSIX.2 collating symbols case 'a' in [[.a.]]) echo ok 1;; esac case '-' in [[.hyphen.]-9]) echo ok 2;; esac case 'p' in [[.a.]-[.z.]]) echo ok 3;; esac case '-' in [[.-.]]) echo ok 4;; esac case ' ' in [[.space.]]) echo ok 5;; esac case ' ' in [[.grave-accent.]]) echo oops - grave;; *) echo ok 6;; esac case '4' in [[.-.]-9]) echo ok 7;; esac # an invalid collating symbol cannot be the first part of a range case 'c' in [[.yyz.]-[.z.]]) echo oops - yyz;; *) echo ok 8;; esac case 'c' in [[.yyz.][.a.]-z]) echo ok 9;; esac # but when not part of a range is not an error case 'c' in [[.yyz.][.a.]-[.z.]]) echo ok 10 ;; esac case 'p' in [[.a.]-[.Z.]]) echo oops -- bad range ;; *) echo ok 11;; esac case p in [[.a.]-[.zz.]p]) echo ok 12;; *) echo oops -- bad range 2;; esac case p in [[.aa.]-[.z.]p]) echo ok 13;; *) echo oops -- bad range 3;; esac case c in [[.yyz.]cde]) echo ok 14;; esac case abc in [[.cb.]a-Za]*) echo ok 15;; esac case $'\t' in [[.space.][.tab.][.newline.]]) echo ok 16;; esac # and finally, test POSIX.2 equivalence classes case "abc" in [[:alpha:]][[=b=]][[:ascii:]]) echo ok 1;; esac case "abc" in [[:alpha:]][[=B=]][[:ascii:]]) echo oops -- =B=;; *) echo ok 2 ;; esac case a in [[=b=]) echo oops;; # an incomplete equiv class is just a string *) echo ok 3;; esac