11 Globbing
Glob characters are often referred to as "wild cards". These are symbols that have special meaning to the shell.
Unlike commands that the shell will run, or options and arguments that the shell will pass to commands, glob characters are interpreted by the shell itself before it attempts to run any command. This means that glob characters can be used with any command.
Globs are powerful because they allow you to specify patterns that match filenames in a directory, so instead of manipulating a single file at a time, you can easily execute commands that will affect many files. For instance, by using glob characters it is possible to manipulate all files with a certain extension or with a particular filename length.
Keep in mind that these globs can be used with any command because it is the shell, not the command that expands with globs into matching filenames. The examples provided in this chapter will use the
echo
command for demonstration.
Asterisk (*)
The asterisk character is used to represent zero or more of any character in a filename. For example, suppose you want to display all of the files in the
/etc
directory that begin with the letter t
:sysadmin@localhost:~$ echo /etc/t*/etc/terminfo /etc/timezonesysadmin@localhost:~$
The pattern
t*
means "match any file that begins with the character t
and has zero or more of any character after the t
".
You can use the asterisk character at any place within the filename pattern. For example, the following will match any filename in the
/etc
directory that ends with .d
:sysadmin@localhost:~$ echo /etc/*.d/etc/apparmor.d /etc/bash_completion.d /etc/cron.d /etc/depmod.d /etc/fstab.d /etc/init.d /etc/insserv.conf.d /etc/ld.so.conf.d /etc/logrotate.d /etc/modprobe.d /etc/pam.d /etc/profile.d /etc/rc0.d /etc/rc1.d /etc/rc2.d /etc/rc3.d /etc/rc4.d /etc/rc5.d /etc/rc6.d /etc/rcS.d /etc/rsyslog.d /etc/sudoers.d /etc/sysctl.d /etc/update-motd.d
In the next example, all of the files in the
/etc
directory that begin with the letter r
and end with .conf
will be displayed:sysadmin@localhost:~$ echo /etc/r*.conf/etc/resolv.conf /etc/rsyslog.conf
Question Mark (?)
The question mark represents any one character. Each question mark character matches exactly one character, no more and no less.
Suppose you want to display all of the files in the
/etc
directory that begin with the letter t
and have exactly 7 characters after the t
character:sysadmin@localhost:~$ echo /etc/t???????/etc/terminfo /etc/timezonesysadmin@localhost:~$
Glob characters can be used together to find even more complex patterns. The
echo /etc/*????????????????????
command will print only files in the /etc
directory with twenty or more characters in the filename:sysadmin@localhost:~$ echo /etc/*????????????????????/etc/bindresvport.blacklist /etc/ca-certificates.confsysadmin@localhost:~$
The asterisk and question mark could also be used together to look for files with three-letter extensions by running the
echo /etc/*.???
command:sysadmin@localhost:~$ echo /etc/*.???/etc/blkid.tab /etc/issue.netsysadmin@localhost:~$
Brackets []
Brackets are used to match a single character by representing a range of characters that are possible match characters. For example,
echo /etc/[gu]*
will print any file that begins with either a g
or u
character and contains zero or more additional characters:sysadmin@localhost:~$ echo /etc/[gu]*/etc/gai.conf /etc/groff /etc/group /etc/group- /etc/gshadow /etc/gshadow- /etc/ucf.conf /etc/udev /etc/ufw /etc/update-motd.d /etc/updatedb.confsysadmin@localhost:~$
Brackets can also be used to a represent a range of characters. For example, the
echo /etc/[a-d]*
command will print all files that begin with any letter between and including a
and d
:sysadmin@localhost:~$ echo /etc/[a-d]*/etc/adduser.conf /etc/adjtime /etc/alternatives /etc/apparmor.d/etc/apt /etc/bash.bashrc /etc/bash_completion.d /etc/bind /etc/bindresvport.blacklist /etc/blkid.conf /etc/blkid.tab /etc/ca-certificates /etc/ca-certificates.conf /etc/calendar /etc/cron.d /etc/cron.daily /etc/cron.hourly /etc/cron.monthly /etc/cron.weekly /etc/crontab /etc/dbus-1 /etc/debconf.conf /etc/debian_version /etc/default/etc/deluser.conf /etc/depmod.d /etc/dpkgsysadmin@localhost:~$
The
echo /etc/*[0-9]*
command would display any file that contains at least one number:sysadmin@localhost:~$ echo /etc/*[0-9]*/etc/dbus-1 /etc/iproute2 /etc/mke2fs.conf /etc/python2.7 /etc/rc0.d/etc/rc1.d /etc/rc2.d /etc/rc3.d /etc/rc4.d /etc/rc5.d /etc/rc6.dsysadmin@localhost:~$
The range is based on the ASCII text table. This table defines a list of characters, arranging them in a specific standard order. If you provide an invalid order, no match will be made:
sysadmin@localhost:~$ echo /etc/*[9-0]*/etc/*[9-0]*sysadmin@localhost:~$
Exclamation Point (!)
The exclamation point is used in conjunction with the square brackets to negate a range. For example, the command
echo [!DP]*
will display any file that does not begin with a D
or P
.12 Quoting
There are three types of quotes that have special significance to the Bash shell: double quotes
"
, single quotes '
, and back quotes `
. Each set of quotes indicates to the shell that it should treat the text within the quotes differently than it would normally be treated.Double Quotes
Double quotes will stop the shell from interpreting some metacharacters, including glob characters. Within double quotes an asterisk is just an asterisk, a question mark is just a question mark, and so on. This means that when you use the second
echo
command below, the BASH shell doesn't convert the glob pattern into filenames that match the pattern:sysadmin@localhost:~$ echo /etc/[DP]*/etc/DIR_COLORS /etc/DIR_COLORS.256color /etc/DIR_COLORS.lightbgcolor /etc/PackageKitsysadmin@localhost:~$ echo "/etc/[DP]*"/etc/[DP]*sysadmin@localhost:~$
This is useful when you want to display something on the screen that is normally a special character to the shell:
sysadmin@localhost:~$ echo "The glob characters are *, ? and [ ]"The glob characters are *, ? and [ ]sysadmin@localhost:~$
Double quotes still allow for command substitution (discussed later in this chapter), variable substitution and permit some other shell metacharacters that haven't been discussed yet. For example, in the following demonstration, you will notice that the value of the
PATH
variable is displayed:sysadmin@localhost:~$ echo "The path is $PATH"The path is /usr/bin/custom:/home/sysadmin/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/gamessysadmin@localhost:~$
Single Quotes
Single quotes prevent the shell from doing any interpreting of special characters. This includes globs, variables, command substitution and other metacharacter that have not been discussed yet.
For example, if you want the
$
character to simply mean a $
, rather than it acting as an indicator to the shell to look for the value of a variable, you could execute the second command displayed below:sysadmin@localhost:~$ echo The car costs $100The car costs 00sysadmin@localhost:~$ echo 'The car costs $100'The car costs $100sysadmin@localhost:~$
Backslash Character (\)
You can use an alternative technique to essentially single quote a single character. For example, suppose you want to print the following: “
The services costs $100 and the path is $PATH
". If you place this in double quotes, $1
and $PATH
are considered variables. If you place this in single quotes,$1
and $PATH
are not variables. But what if you want to have $PATH
treated as a variable and $1
not?
If you place a backslash
\
character in front of another character, it treats the other character as a "single quoted" character. The third command below demonstrates using the \
character while the other two demonstrate how the variables would be treated within double and single quotes:sysadmin@localhost:~$ echo "The service costs $100 and the path is $PATH"The service costs 00 and the path is /usr/bin/custom:/home/sysadmin/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/gamessysadmin@localhost:~$ echo 'The service costs $100 and the path is $PATH'The service costs $100 and the path is $PATHsysadmin@localhost:~$ echo The service costs \$100 and the path is $PATHThe service costs $100 and the path is /usr/bin/custom:/home/sysadmin/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/gamessysadmin@localhost:~$
Back Quotes
Back quotes are used to specify a command within a command, a process called command substitution. This allows for very powerful and sophisticated use of commands.
While it may sound confusing, an example should make things more clear. To begin, note the output of the
date
command:sysadmin@localhost:~$ dateMon Nov 2 03:35:50 UTC 2015
Now note the output of the
echo Today is date
command line:sysadmin@localhost:~$ echo Today is dateToday is datesysadmin@localhost:~$
In the previous command the word
date
is treated as regular text and the shell simply passes date
to the echo
command. But, you probably want to execute the date
command and have the output of that command sent to the echo
command. To accomplish this, you would run the echo Today is `date`
command line:sysadmin@localhost:~$ echo Today is `date`Today is Mon Nov 2 03:40:04 UTC 2015sysadmin@localhost:~$
13 Control Statements
Control statements allow you to use multiple commands at once or run additional commands, depending on the success of a previous command. Typically these control statements are used within scripts, but they can also be used on the command line as well.
Semicolon
The semicolon can be used to run multiple commands, one after the other. Each command runs independently and consecutively; no matter the result of the first command, the second will run once the first has completed, then the third and so on.
For example, if you want to print the months of January, February and March of 2015, you can execute
cal 1 2015; cal 2 2015; cal 3 2015
on the command line:sysadmin@localhost:~$ cal 1 2015; cal 2 2015; cal 3 2015January 2015Su Mo Tu We Th Fr Sa4 5 6 7 8 9 101 2 318 19 20 21 22 23 2411 12 13 14 15 16 1725 26 27 28 29 30 311 2 3 4 5 6 7February 2015 Su Mo Tu We Th Fr Sa22 23 24 25 26 27 288 9 10 11 12 13 14 15 16 17 18 19 20 211 2 3 4 5 6 7March 2015 Su Mo Tu We Th Fr Sa 8 9 10 11 12 13 1429 30 3115 16 17 18 19 20 2122 23 24 25 26 27 28
Double Ampersand (&&)
The double ampersand
&&
acts as a logical "and" if the first command is successful, then the second command (to the right of the &&
) will also run. If the first command fails, then the second command will not run.
To better understand how this works, consider first the concept of failure and success for commands. Commands succeed when they work properly and fail when something goes wrong. For example, consider the
ls /etc/xml
command line. The command will succeed if the /etc/xml
directory is accessible and fail if it isn't.
For example, the first command will succeed because the
/etc/xml
directory exists and is accessible while the second command will fail because there is no /junk
directory:sysadmin@localhost:~$ ls /etc/xmlcatalog catalog.old xml-core.xml xml-core.xml.oldsysadmin@localhost:~$ ls /etc/junkls: cannot access /etc/junk: No such file or directorysysadmin@localhost:~$
The way that you would use the success or failure of the
ls
command in conjunction with &&
would be to execute a command line like the following:sysadmin@localhost:~$ ls /etc/xml && echo successcatalog catalog.old xml-core.xml xml-core.xml.oldsuccesssysadumin@localhost:~$ ls /etc/junk && echo successls: cannot access /etc/junk: No such file or directorysysadmin@localhost:~$
In the first example above, the
echo
command executed because the ls
command succeeded. In the second example, the echo
command wasn't executed because the ls
command failed.Double Pipe
The double pipe
||
is a logical "or". It works in a similar way to &&
; depending on the result of the first command, the second command will either run or be skipped.
With the double pipe, if the first command runs successfully, the second command is skipped; if the first command fails, then the second command will be run. In other words, you are essentially telling the shell, "Either run this first command or the second one”.
In the following example, the
echo
command will only execute if the ls
command fails:sysadmin@localhost:~$ ls /etc/xml || echo failedcatalog catalog.old xml-core.xml xml-core.xml.oldsysadmin@localhost:~$ ls /etc/junk || echo failedls: cannot access /etc/junk: No such file or directoryfailedsysadmin@localhost:~$
Finish .....
Sumber : www.netacad.com
0 comments