一、通配符



1、一般通配符


    ① * (星号):匹配字符的0次或多次出现


    举例:f*可以匹配f、fa、fls.a

    注意:“.”和“/”必须显示匹配

         *file无法匹配.file,必须用.*file

         /etc*.c无法匹配/etc/a.c,必须用/etc/*.c


    ② ? (问号):匹配任意一个字符


    举例:f?可以匹配fa、f3,但不能匹配f、fa2


    ③ [] (一对括号):匹配括号内的字符组


    举例:f[abc]可匹配fa、fb、fc

    注意:可以用“-”来表示范围,即f[a-c]和上面的例子是一样的

         另外*和?在[]里面将不再表示通配符,而仅为普通字符


    ④ ! (惊叹号):紧跟在[后面,表示不再该范围内


    举例:f[!1-9].c用以匹配f后面不是1-9的.c文件,即可以是fa.c

    注意:[]也仅匹配一个字符,即不可能是其中的2个或2个以上


2、模式表达式


    ① *(模式表):匹配给定表模式0次或多次出现


    举例:file*(.c  | .o)将匹配file、file.c、file.o、file.c.c、file.o.c等


    ② +(模式表):匹配给定表模式1次或多次出现


    举例:file+(.c | .o)将匹配file.c、file.o、file.c.c、file.o.c等,不匹配file


    ③ ?(模式表):匹配给定表任何模式的0次或1次出现


    举例:file?(.c | .o)只匹配file、file.c、file.o,不匹配file.c.c、file.c.o


    ④ @(模式表):仅匹配给定表模式1次 出现


    举例:file@(.c | .o)只匹配file.c、file.o


    ⑤ !(模式表):出给定表中的一个模式之外,可以匹配任何东西




二、引号



1、双引号


    双引号可以将除了“$”、“`”、“\”外的所有内容作为普通字符处理, 三个例外仍保留特殊功能


    “$”:表示变量替换

    “`”:倒引号,表示命令替换

    “\”:转义符,告诉shell不要对$、`、"、\或换行符进行特殊处理


    举例:

    $ echo "current directory is `pwd`"  --current directory is /home/wxq/prog

    $ echo "home directory is $HOME"  --home directory is /home/wxq

    $ echo "file*.?"  --file*.?

    $ echo "home directory is \$HOME"  --home directory is $HOME

    $ echo "directory '$HOME'"  --directory /home/wxq


2、单引号


    单引号中的任何字符均作为普通字符,例如:

    $ echo 'echo "directory is $HOME"'  --echo "directory is $HOME"


3、倒引号


    倒引号括起来的字符串被shell解释为命令,用运行命令后的返回信息代替这个引号内容。


    举例

    $ today=`date`

    $ echo Today is $today

    --Today is Fri Feb 20 08:59:01 CST 2009


    $ Nuser=`echo The number of users is \`who|wc -l\``

    $ echo $Nuser

    --The number of users is 1




三、输入/输出重定向


1、输入重定向符


    “<”:将命令的标准输入重新定向到指定文件,例如:

    $ bash < file1

    即将file1中的所有语句使用bash命令全部重新执行一遍


2、输出重定向符


    “>”:将命令的标准输出重定向到指定文件,例如:

    $ date > abc

    这样屏幕上不再显示date命令的结果,而全部保存到文件abc中

    $ ex2 > abc

    shell脚本的执行结果也可以输出到文件abc中


    注:不但可以输出到普通文件,还可以对应I/O设备,例如:

        $ cat f1.c > /dev/lp0  --在并行打印机上打印


3、输出附加定向符


    “>>”:将输出内容附加到原来文件的后面,不破坏原来的内容。例如:

    $ ps -l >> psfile


4、即时文件定向符


    “<<”:将输入行重新定向到一个命令中,例如:

    $ bash << %%

    ls

    date

    %%


    注:必须以一对标记符来标注输入的内容,如上例中为%%


5、与文件描述字有关的重定向


    “n>”“n>>”:将特定类型的文字描述输出到文件中,例如:

    $ gcc m1.c 2 > errfile

    表示将对m1.c的编译过程中产生的错误放入文件errfile中


    注:0代表输入、1代表输出、2代表错误输出,另外还有3-9


    另注:输入输出定相符可以同时使用,如: $ wc -l < infile > outfile




四、注释、管道线和后台命令


1、注释


    ​“#”​:以#开头的正文行表示注释


    注:如果脚本第一行以#!开头,则后面接所使用shell的绝对路径


2、管道线(过滤器)


    “|”:表示前一个命令的输出正好是后一个命令的输入,例如:

    $ ls -l | wc -l


    ls输出所有当前路径下文件夹及文件名称,再由wc命令统计行数


3、后台命令


    “&”:在每条命令最后加上&,表示该命令为后台命令,例如:

    $ gcc m1.c&


    注:后台执行的意义在于,后台程序仅在CPU有空闲时执行,可以提高系统效率




五、命令执行操作符


1、顺序执行


    “;”:在同一行中使用分号将各个命令隔开,表示顺序执行,例如:

    $ pwd; who |wc -l; cd /usr/bin


    注:执行时从左至右,前面命令成功与否不影响后面


2、逻辑与


    “&&”:把两个命令连载一起,若前面的成功则执行后面的,例如:

    $ cp aaa bbb && rm aaa


    注:&&可以把多个命令都连起来,但是只要只要中间任何一个未执行成功,后面的就均不执行


3、逻辑或


    “||”:如果前面的不成功,则执行后面的,例如:

    $ cat aaa || pwd  --如果不能把abc内容列出,则显示当前目录路径


    注:||也可以连接多个命令,且与&&优先级相同,但都低于|和&




六、成组数据


1、{ }形式


    以{}括起来的全部命令视为一条命令,出现在管道的一边。例如:

    $ { echo "User Report for `date`."; who;} | pr


    上例的作用就是可以将echo和who两个命令的结果,一起传输给pr


    注意:{后面必须要有一个空格,}前必须要有分号,另外{}内的内容可以多行。


2、( )形式


    ()可以完成与{}一样的效果,而且无需加空格和分号


    注:()和{}有本质的区别是:()会生成新的子shell进程,而不会改变父shell的变量值及工作目录


    $ a="current values";export a
    $ echo $a
    current values
    $ (a="new value-1";echo $a)
    new value-1
    $ echo $a
    current values
    $ { a="new value-2";echo $a;}
    new value-2
    $ echo $a
    new value-2

    $ pwd
    /opt/test
    $ (cd /bin;pwd)
    /bin
    $ pwd
    /opt/test
    $ { cd /bin;pwd;}
    /bin
    $ pwd
    /bin
 

-------

最后补充一下:

关于%, 需要再加一个%,变成%% 让SHELL来处理。