1 echo *
" * "字符意味着匹配文件名中的任意字符,shell会在执行echo命令之前把*扩展成其他内容。
一、路径扩展(pathname Expansion)
通过使用通配符来实现扩展的机制称为路径名扩展。
1 echo D* 2 echo *s 3 echo [[:uppper:]]* 4 echo /usr/*/share
二、波浪线扩展(Tilde Expansion)
tilde character(~) 有一个特殊的意义,当它用于单词的开头时,它将被扩展成用户的主目录名。如果没有指定用户名,则扩展到当前目录。
1 echo ~ 2 echo ~foo
三、算术扩展(Arithmetic Expansion)
算术扩展使用:$((expression)),算术扩展只支持整数。
1 echo $(($((5**2)) * 3))
四、花括号扩展(Brace Expansion)
用于花括号扩展的模式包含一个称为前导字符(preamble)的开头部分和一个称为附言(postscript)的结尾部分。花括号表达式本身可以包含一系列逗号分隔的字符串,也可以包含一系列整数或者单个字符。
1 [me@linuxbox ~]$ echo Front-{A,B,C}-Back 2 Front-A-Back Front-B-Back Front-C-Back
1 [me@linuxbox ~]$ echo Number_{1..5} 2 Number_1 Number_2 Number_3 Number_4 Number_5
1 [me@linuxbox ~]$ echo {01..15} 2 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 3 [me@linuxbox ~]$ echo {001..15} 4 001 002 003 004 005 006 007 008 009 010 011 012 013 014 015
1 [me@linuxbox ~]$ echo {Z..A} 2 Z Y X W V U T S R Q P O N M L K J I H G F E D C B A
花括号扩展也支持嵌套:
1 [me@linuxbox ~]$ echo a{A{1,2},B{3,4}}b 2 aA1b aA2b aB3b aB4b
在新建文件夹时操作方便:
1 [me@linuxbox ~]$ mkdir Photos 2 [me@linuxbox ~]$ cd Photos 3 [me@linuxbox Photos]$ mkdir {2007..2009}-{01..12} 4 [me@linuxbox Photos]$ ls 5 2007-01 2007-07 2008-01 2008-07 2009-01 2009-07 6 2007-02 2007-08 2008-02 2008-08 2009-02 2009-08 7 2007-03 2007-09 2008-03 2008-09 2009-03 2009-09 8 2007-04 2007-10 2008-04 2008-10 2009-04 2009-10 9 2007-05 2007-11 2008-05 2008-11 2009-05 2009-11 10 2007-06 2007-12 2008-06 2008-12 2009-06 2009-12
五、参数扩展(parameter expansion)
参数扩展在shell脚本中比直接用在命令行中有用,它的许多特性与系统存储小块数据以及给每个小块数据命名的性能有关。
1 [me@linuxbox ~]$ echo $USER 2 me
六、命令替换(Command Substitution)
命令替换可以将一个命令的输出作为一个扩展模式使用:
1 [me@linuxbox ~]$ echo $(ls) 2 Desktop Documents ls-output.txt Music Pictures Public Templates 3 Videos
[me@linuxbox ~]$ ls -l $(which cp) -rwxr-xr-x 1 root root 71516 2007-12-05 08:58 /bin/cp
1 [me@linuxbox ~]$ file $(ls -d /usr/bin/* | grep zip) 2 /usr/bin/bunzip2: symbolic link to `bzip2' 3 /usr/bin/bzip2: ELF 32-bit LSB executable, Intel 80386, 4 version 1 (SYSV), dynamically linked (uses shared libs), for 5 GNU/Linux 2.6.9, stripped 6 /usr/bin/bzip2recover: ELF 32-bit LSB executable, Intel 80386, 7 version 1 (SYSV), dynamically linked (uses shared libs), for 8 GNU/Linux 2.6.9, stripped 9 /usr/bin/funzip: ELF 32-bit LSB executable, Intel 80386, 10 version 1 (SYSV), dynamically linked (uses shared libs), for 11 GNU/Linux 2.6.9, stripped 12 /usr/bin/gpg-zip: Bourne shell script text executable 13 /usr/bin/gunzip: symbolic link to `../../bin/gunzip' 14 /usr/bin/gzip: symbolic link to `../../bin/gzip' 15 /usr/bin/mzip: symbolic link to `mtools'
在上面这个例子中,管道的输出为file命令的参数列表。