These days there is also a library routine glob(3) that will perform this function for a user program.
The rules are as follows (POSIX.2, 3.13).
A aq?aq (not between brackets) matches any single character.
A aq*aq (not between brackets) matches any string, including the empty string.
Character classes
An expression "[...]" where the first character after the leading aq[aq is not an aq!aq matches a single character, namely any of the characters enclosed by the brackets. The string enclosed by the brackets cannot be empty; therefore aq]aq can be allowed between the brackets, provided that it is the first character. (Thus, "[][!]" matches the three characters aq[aq, aq]aq and aq!aq.)
Ranges
There is one special convention: two characters separated by aq-aq denote a range. (Thus, "[A-Fa-f0-9]" is equivalent to "[ABCDEFabcdef0123456789]".) One may include aq-aq in its literal meaning by making it the first or last character between the brackets. (Thus, "[]-]" matches just the two characters aq]aq and aq-aq, and "[--0]" matches the three characters aq-aq, aq.aq, aq0aq, since aq/aq cannot be matched.)
Complementation
An expression "[!...]" matches a single character, namely any character that is not matched by the expression obtained by removing the first aq!aq from it. (Thus, "[!]a-]" matches any single character except aq]aq, aqaaq and aq-aq.)
One can remove the special meaning of aq?aq, aq*aq and aq[aq by preceding them by a backslash, or, in case this is part of a shell command line, enclosing them in quotes. Between brackets these characters stand for themselves. Thus, "[[?*\]" matches the four characters aq[aq, aq?aq, aq*aq and aq\aq.
If a filename starts with a aq.aq, this character must be matched explicitly. (Thus, rm * will not remove .profile, and tar c * will not archive all your files; tar c . is better.)
xv -wait 0 *.gif *.jpgwhere perhaps no *.gif files are present (and this is not an error). However, POSIX requires that a wildcard pattern is left unchanged when it is syntactically incorrect, or the list of matching pathnames is empty. With bash one can force the classical behavior by setting allow_null_glob_expansion=true.
(Similar problems occur elsewhere.
E.g., where old scripts have
rm `find . -name "*~"`new scripts require
rm -f nosuchfile `find . -name "*~"`to avoid error messages from rm called with an empty argument list.)
Now that regular expressions have bracket expressions where the negation is indicated by a aq^aq, POSIX has declared the effect of a wildcard pattern "[^...]" to be undefined.
(iii) Ranges X-Y comprise all characters that fall between X and Y (inclusive) in the current collating sequence as defined by the LC_COLLATE category in the current locale.
(iv) Named character classes, like
[:alnum:] [:alpha:] [:blank:] [:cntrl:] [:digit:] [:graph:] [:lower:] [:print:] [:punct:] [:space:] [:upper:] [:xdigit:]so that one can say "[[:lower:]]" instead of "[a-z]", and have things work in Denmark, too, where there are three letters past aqzaq in the alphabet. These character classes are defined by the LC_CTYPE category in the current locale.
(v) Collating symbols, like "[.ch.]" or "[.a-acute.]", where the string between "[." and ".]" is a collating element defined for the current locale. Note that this may be a multi-character element.
(vi) Equivalence class expressions, like "[=a=]", where the string between "[=" and "=]" is any collating element from its equivalence class, as defined for the current locale. For example, "[[=a=]]" might be equivalent to "[a????]" (warning: Latin-1 here), that is, to "[a[.a-acute.][.a-grave.][.a-umlaut.][.a-circumflex.]]".