Advanced Bash-Scripting Guide
18.2. Globbing
Bash itself cannot recognize Regular Expressions. Inside scripts, it is commands and utilities -- such as sed
and awk -- that interpret RE's.
Bash does carry out filename expansion [100] -- a process known as globbing -- but this does not use the standard RE set. Instead, globbing recognizes and expands wild cards. Globbing interprets the standard wild
card characters [101] -- * and ?, character lists in square brackets, and certain other special characters (such as
^ for negating the sense of a match). There are important limitations on wild card characters in globbing, however. Strings containing
*
will not match filenames that start with a dot, as, for example,
. [102]
Likewise, the
?
has a different meaning in globbing than as part of an RE.
bash$
ls -l
total 2
-rw-rw-r-- 1 bozo bozo 0 Aug 6 18:42 a.1
-rw-rw-r-- 1 bozo bozo 0 Aug 6 18:42 b.1
-rw-rw-r-- 1 bozo bozo 0 Aug 6 18:42 c.1
-rw-rw-r-- 1 bozo bozo 466 Aug 6 17:48 t2.sh
-rw-rw-r-- 1 bozo bozo 758 Jul 30 09:02 test1.txt
bash$
ls -l t?.sh
-rw-rw-r-- 1 bozo bozo 466 Aug 6 17:48 t2.sh
bash$
ls -l [ab]*
-rw-rw-r-- 1 bozo bozo 0 Aug 6 18:42 a.1
-rw-rw-r-- 1 bozo bozo 0 Aug 6 18:42 b.1
bash$
ls -l [a-c]*
-rw-rw-r-- 1 bozo bozo 0 Aug 6 18:42 a.1
-rw-rw-r-- 1 bozo bozo 0 Aug 6 18:42 b.1
-rw-rw-r-- 1 bozo bozo 0 Aug 6 18:42 c.1
bash$
ls -l [^ab]*
-rw-rw-r-- 1 bozo bozo 0 Aug 6 18:42 c.1
-rw-rw-r-- 1 bozo bozo 466 Aug 6 17:48 t2.sh
-rw-rw-r-- 1 bozo bozo 758 Jul 30 09:02 test1.txt
bash$
ls -l {b*,c*,*est*}
-rw-rw-r-- 1 bozo bozo 0 Aug 6 18:42 b.1
-rw-rw-r-- 1 bozo bozo 0 Aug 6 18:42 c.1
-rw-rw-r-- 1 bozo bozo 758 Jul 30 09:02 test1.txt
Bash performs filename expansion on unquoted command-line arguments. The echo command demonstrates
this.
bash$
echo *
a.1 b.1 c.1 t2.sh test1.txt
bash$
echo t*
t2.sh test1.txt
bash$
echo t?.sh
t2.sh
Chapter 18. Regular Expressions 357
Advanced Bash-Scripting Guide
It is possible to modify the way Bash interprets special characters in globbing. A set -f command disables globbing, and the
nocaseglob
and
nullglob
options to shopt change globbing behavior.
See also Example 11-5.
Filenames with embedded whitespace can cause globbing to choke. David Wheeler shows how to avoid
many such pitfalls.
IFS="$(printf '\n\t')" # Remove space.
# Correct glob use:
# Always use for-loop, prefix glob, check if exists file.
for file in ./* ; do # Use ./* ... NEVER bare *
if [ -e "$file" ] ; then # Check whether file exists.
COMMAND ... "$file" ...
fi done
# This example taken from David Wheeler's site, with permission.
Chapter 18. Regular Expressions 358