18.2. Globbing. Comtrol DeviceMaster Software Development Kit
โฆษณา
โฆษณา
Advanced Bash-Scripting Guide
18.2. Globbing
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
^ 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,
.bashrc
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.
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
ดาวน์โหลด
โฆษณา