Shell Expansion

Pathname Expansion:

[me@linuxbox me]$ echo [[:upper:]]*
Desktop Documents Music Pictures Public Templates Videos

 

Tilde Expansion:

[me@linuxbox me]$ echo ~
/home/me

 

Arithmetic Expansion:

[me@linuxbox me]$ echo $((2 + 2))
4

which takes the form: 

$((expression))

Arithmetic expansion only supports integers (whole numbers, no decimals).

 

Braces Expansion:

Maybe this is the strangest expansion. you can create multiple strings with a pattern of braces. such as:

[me@linuxbox me]$ echo Front-{A,B,C}-Back
Front-A-Back Front-B-Back Front-C-Back

The content in the braces may contain a preamble and a postscript.

[me@linuxbox me]$ echo Number_{1..5}
Number_1 Number_2 Number_3 Number_4 Number_5

It can also be nested:

[me@linuxbox me]$ echo a{A{1,2},B{3,4}}b
aA1b aA2b aB3b aB4b

So what is this good for? Consider you have a bunch of folders to be created:

[me@linuxbox me]$ mkdir Photos
[me@linuxbox me]$ cd Photos
[me@linuxbox Photos]$ mkdir {2007..2009}-0{1..9} {2007..2009}-{10..12}
[me@linuxbox Photos]$ ls

2007-01 2007-07 2008-01 2008-07 2009-01 2009-07
2007-02 2007-08 2008-02 2008-08 2009-02 2009-08
2007-03 2007-09 2008-03 2008-09 2009-03 2009-09
2007-04 2007-10 2008-04 2008-10 2009-04 2009-10
2007-05 2007-11 2008-05 2008-11 2009-05 2009-11
2007-06 2007-12 2008-06 2008-12 2009-06 2009-12

Parameter Expansion:

[me@linuxbox me]$ echo $USER
me

To see available variables:

[me@linuxbox me]$ printenv | less

 

Command Substituion

Command Substitution allows us to use the output of a command as an expansion. e.g.

[me@linuxbox me]$ echo $(ls)
Desktop Documents ls-output.txt Music Pictures Public Templates Videos

Another one:

me@linuxbox me]$ ls -l $(which cp)
-rwxr-xr-x 1 root root 71516 2007-12-05 08:58 /bin/cp

The alternative syntax is to use back-quotes instead of the dollar sign and parenthesis:

[me@linuxbox me]$ ls -l `which cp`
-rwxr-xr-x 1 root root 71516 2007-12-05 08:58 /bin/cp

 

Double Quotes:

All special characters used by the shell lose their special meaning and are treated as ordinary characters. The exceptions are "$", "\" and "`". This means word-splitting, pathname expansion, tilde expansion, and brace expansion are all suppressed. but parameter expansion, arithmetic expansion, ad command substitution are still carried out.

[me@linuxbox me]$ echo "$USER $((2+2)) $(cal)"

me 4
February 2008
Su Mo Tu We Th Fr Sa
                1  2
 3  4  5  6  7  8  9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29

The fact that newlines are considered delimiters by the word-splitting mechanism causes an interesting, albeit subtle, effect on command substitution. Consider the followings:

[me@linuxbox me]$ echo $(cal)
February 2008 Su Mo Tu We Th Fr Sa 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
[me@linuxbox me]$ echo "$(cal)"

February 2008
Su Mo Tu We Th Fr Sa
                1  2
 3  4  5  6  7  8  9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29

 

Single Quotes

To suppress all expansions, use single quotes:

[me@linuxbox me]$ echo text ~/*.txt {a,b} $(echo foo) $((2+2)) $USER
text /home/me/ls-output.txt a b foo 4 me
[me@linuxbox me]$ echo "text ~/*.txt {a,b} $(echo foo) $((2+2)) $USER"
text ~/*.txt {a,b} foo 4 me
[me@linuxbox me]$ echo 'text ~/*.txt {a,b} $(echo foo) $((2+2)) $USER'
text ~/*.txt {a,b} $(echo foo) $((2+2)) $USER

 

Escaping Characters:

Backslash is used as the escape character. It's usually used to selectively prevent an expansion:

[me@linuxbox me]$ echo "The balance for user $USER is: \$5.00"
The balance for user me is: $5.00

 

More about backslash

Use backslash to get the shell to ignore the newline like this:

ls -l \
   --reverse \
   --human-readable \
   --full-time
       

Backslash escape characters:

[me@linuxbox me]$ echo -e "Inserting several blank lines\n\n\n"
Inserting several blank lines



[me@linuxbox me]$ echo -e "Words\tseparated\tby\thorizontal\ttabs."
Words separated   by  horizontal  tabs
[me@linuxbox me]$ echo -e "\aMy computer went \"beep\"."

My computer went "beep".

[me@linuxbox me]$ echo -e "DEL C:\\WIN2K\\LEGACY_OS.EXE"

DEL C:\WIN2K\LEGACY_OS.EXE

 

From: http://linuxcommand.org/lc3_lts0080.php

posted @ 2014-03-18 23:29  mushr0m  阅读(407)  评论(0编辑  收藏  举报