Monday, January 19, 2009

万用字符与特殊符号

    由于在 bash 当中常会使用到一些万用字符,与搭配特殊符号来将指令做更好的利用(例如最常提到的正规表示法 Regulare Express )!底下我们列出一些常用的万用字符与特殊符号:
    符号
    内容
    *
    万用字符,代表一个或多个字符(或数字)
    ?
    万用字符,代表一个字母
    #
    批注,这个最常被使用在 script 当中,视为说明!
    \
    跳脱符号,将『特殊字符或万用字符』还原成一般字符
    |
    分隔两个管线命令的界定
    ;
    连续性命令的界定(注意!与管线命令并不相同)
    ~
    使用者的家目录
    $
    亦即是变量之前需要加的变量取代值
    &
    将指令变成背景下工作
    !
    逻辑运算意义上的『非』 not 的意思!
    /
    路径分隔的符号
    >, >>
    输出导向,分别是『取代』与『累加』
    '
    单引号,不具有变量置换的功能
    "
    具有变量置换的功能!
    ` `
    两个『 ` 』中间为可以先执行的指令!
    ( )
    在中间为子 shell 的起始与结束
    [ ]
    在中间为字符的组合
    { }
    在中间为命令区块的组合!
    组合按键
    执行结果
    Ctrl + C
    终止目前的命令
    Ctrl + D
    输入结束(EOF),例如邮件结束的时候;
    Ctrl + M
    就是 Enter 啦!
    Ctrl + S
    暂停屏幕的输出
    Ctrl + Q
    恢复屏幕的输出
    Ctrl + U
    在提示字符下,将整列命令删除
    Ctrl + Z
    『暂停』目前的命令
    上面的万用字符当中,最常用的就属 *, ?, [] 及 ` 了!我们提几个简单的例子:
    [test @test test]# ls test* <==那个 * 代表后面不论接几个字符都予以接受(没有字符也接受!)
    [test @test test]# ls test? <==那个 ? 代表后面『一定』要接『一个』字符
    [test @test test]# ls test??? <==那个 ??? 代表『一定要接三个』字符!
    [test @test test]# cp test[1-5] /tmp <==将 test1, test2, test3, test4, test5 若存在的话,就拷贝到 /tmp 下
    [test @test test]# cd /lib/modules/`uname -r`/kernel/drivers <==被 ` ` 括起来的内容『会先执行』!
    上面几个例子相当的有趣!尤其是最后面两个!需要注意的是, [] 里面『代表只有一个字符』但是范围可以由 1-5 ,这样来说的话,那么我们如果允许『只要档名里面含有至少一个大写字符』时,就可以将档案 copy 出来的话,可以这样做:
     
      cp *[A-Z]* /tmp

    很有趣吧?! ^_^
    此外,那个 `` 里面的『指令』会先被执行,也就是说:
     
    1. 系统先执行 uname -r 找出输出的结果;
    2. 将结果累加在目录上面,来执行 cd 的功能!

    很棒吧!!这些基本的功能需要特别来了解一下才行呦!

  • 连续指令的下达方式:

  • 这里需要再提几个重要的信息,我们刚刚上面提过说,两个指令先后写在一起,可以这样写:
     
      command1; command2

    利用分号『 ; 』来分隔,这个分号的意思,代表不论 command1 执行结果为何,command2 都会被执行!那么如果我是两个相关的指令,第一个 command1 如果执行结果有错误,第二个就不被执行,可以这样做吗?当然可以,就使用下面两个连结的咚咚:
     
      command1 && command2
      command1 || command2

    还记得我们之前的变量内容中,那个 ? 代表什么吗?没错,就是代表前一个执行的指令内容有没有错误,如果有错误就回传为 1 ,没有错误就回传为 0 ,你可以经由 echo $? 来查询得知!那么 && 就是代表,当 command1 执行结果传回值为 0 的时候,也就是没有错误讯息时,则 command2 才会开始执行,而 || 恰恰相反,当 command1 有错误讯息时, command2 才会执行!举个例子来说,我的系统中并没有 /vbird 这个目录,所以执行 ls /vbird 应该会有错误讯息才对,所以,底下三个指令串会显示什么呢?
    [root @test root]# ls /vbird ; ls /
    [root @test root]# ls /vbird && ls /
    [root @test root]# ls /vbird || ls /
    试看看呦! copy from linux-vbird

No comments: