Chinaunix首页 | 论坛 | 博客
  • 博客访问: 588306
  • 博文数量: 187
  • 博客积分: 10025
  • 博客等级: 上将
  • 技术积分: 2990
  • 用 户 组: 普通用户
  • 注册时间: 2007-06-18 17:40
文章分类

全部博文(187)

文章存档

2010年(1)

2009年(23)

2008年(163)

我的朋友

分类: LINUX

2008-05-16 12:14:44

shell相关[摘自鸟哥]
Success is not final, failure is not fatal: it is the courage to continue that counts.
成功并非结局,失败并非毁灭:继续前进的勇气才是重点。
- Winston Churchill
--------------------------------------------------------------------------------
   1. 变量与变量内容以等号『=』来连结;
   2. 等号两边不能直接接空格符;
   3. 变量名称只能是英文字母与数字,但是数字不能是开头字符;
   4. 若有空格符可以使用双引号『 " 』或单引号『 ' 』来将变量内容结合起来,但须要特别留意,双引号内的特殊字符可以保有变量特性,但是单引号内的特殊字符则仅为一般字符;
   5. 必要时需要以跳脱字符『 \ 』来将特殊符号(如Enter, $, \, 空格符, '等)变成一般符号;
   6. 在一串指令中,还需要藉由其它的指令提供的信息,可以使用 quote 『 ` command` 』;
   7. 若该变量为扩增变量内容时,则需以双引号及 $变量名称如:『 "$PATH":/home』继续累加内容;
   8. 若该变量需要在其它子程序执行,则需要以 export 来使变量可以动作,如『export PATH』;
   9. 通常大写字符为系统预设变量,自行设定变量可以使用小写字符,方便判断(纯粹依照使用者兴趣与嗜好);
  10. 取消变量的方法为:『unset 变量名称』。
例题:在变量的设定中,单引号与双引号有什么不同呢?
答:
    单引号与双引号的最大不同在于双引号仍然可以保有变量的内容,但单引号内仅能是一般字符,而不会有特殊符号。我们以底下的例子做说明:假设您定义了一个变量, name=VBird ,现在想以 name 这个变量定义出 myname 显示 VBird its me 这个内容,要如何订定呢?
        [root @test root]# name=VBird
        [root @test root]# echo $name
        VBird
        [root @test root]# myname="$name its me"
        [root @test root]# echo $myname
        VBird its me
        [root @test root]# myname='$name its me'
        [root @test root]# echo $myname
        $name its me
    发现了吗?没错!使用了单引号的时候,那么 $name 将失去原有的变量内容,仅为一般字符的显示型态而已!这里必需要特别小心在意!
例题:在指令下达的过程中, quote ( ` ) 这个符号代表的意义为何?
答:
    在一串指令中,在 ` 之内的指令将会被先执行,而其执行出来的结果将做为外部的输入信息!例如 uname –r 会显示出目前的核心版本,而我们的核心版本在 /lib/modules 里面,因此,你可以先执行 uname –r 找出核心版本,然后再以『 cd 目录』到该目录下,当然也可以执行
        cd /lib/modules/`uname –r`
    直接到该目录下去!
# unset
就是直接将该变量的内容拿掉:
 
      unset 变数
就是直接将该变量的内容拿掉:
 
      unset 变数
# export
当你取得一个 bash 之后,亦即得到了一个程序了,但是若你再次的执行一次 bash ,那么你将进入『子程序』,这个程序的概念我们在资源管理章节中再详谈,这里您先有个概念即可。那么由于您已经进入了该子程序,所以在父程序中的变量设定将不再继续的存在。如您想要让该变量内容继续的在子程序中使用,那么就请执行:
 
      export 变数
# 变量的有效范围:
由前面的 export 以及相关的说明,你可以很清楚的知道一件事情,那就是,『变量的设定只在目前这个 shell 环境当中存在,在下个或者是在子程序中 ( 子 shell ) 将不会存在!』要让变量在下个程序也可以继续的使用,大概就是使用 export 这个咚咚啦!
# read:
上面我们谈到的『变量』都是由『指令列』直接设定好的!那么可不可以随时来提供使用只以键盘随时输入变量内容?也就是说,变量内容是由使用者由键盘输入的哩!呵呵!可以使用 read 来达成喔!这个东西在『 script 』里面比较重要啦!所以我们在 shell script 里面会再次的提到喔!
语法:
[test @test test]# read name
testing <==这个时候屏幕会等待使用者由键盘输入喔!
[test @test test]# echo $name
testing <==刚刚输入的数据变成了变量的内容啦!

[test @test test]# !66       <==执行第 66 个历史指令
[test @test test]# !!               <==执行上一个指令(在本例中,就是 !66 那一个指令!)
[test @test test]# !al              <==执行最近一次以 al 为开头的指令内容,就是第 67 个指令啰!
 

万用字符与特殊符号
      由于在 bash 当中常会使用到一些万用字符,与搭配特殊符号来将指令做更好的利用(例如最常提到的正规表示法 Regulare Express )!底下我们列出一些常用的万用字符与特殊符号:
      
      符号
         
      内容
      *
         
      万用字符,代表一个或多个字符(或数字)
      ?
         
      万用字符,代表一个字母
      #
         
      批注,这个最常被使用在 script 当中,视为说明!
      \
         
      跳脱符号,将『特殊字符或万用字符』还原成一般字符
      |
         
      分隔两个管线命令的界定;
      ;
         
      连续性命令的界定(注意!与管线命令并不相同)
      ~
         
      使用者的家目录
      $
         
      亦即是变量之前需要加的变量取代值
      &
         
      将指令变成背景下工作

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  <==被 ` ` 括起来的内容『会先执行』!
      !
         
      逻辑运算意义上的『非』 not 的意思!
      /
         
      路径分隔的符号
      >, >>
         
      输出导向,分别是『取代』与『累加』
      '
         
      单引号,不具有变量置换的功能
      "
         
      具有变量置换的功能!
      ` `
         
      两个『 ` 』中间为可以先执行的指令!
      (   )
         
      在中间为子 shell 的起始与结束
      [  ]
         
      在中间为字符的组合
      {   }
         
      在中间为命令区块的组合!
...................................................................................................
特别注意,单引号和`符号的区别,第一次就看错了。
》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
# 连续指令的下达方式:
这里需要再提几个重要的信息,我们刚刚上面提过说,两个指令先后写在一起,可以这样写:
 
      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 /
......................-________________________________------
这个也是比较容易 出错的地方。

test @test test]# ls -al >  list.txt
将显示的结果输出到 list.txt 档案中,若该档案以存在则予以取代!
[test @test test]# ls -al >> list.txt
将显示的结果累加到 list.txt 档案中,该档案为累加的,旧数据保留!
[test @test test]# ls -al 1> list.txt 2> list.err
将显示的数据,正确的输出到 list.txt 错误的数据输出到 list.err
[test @test test]# ls -al 1> list.txt 2>&1
将显示的数据,不论正确或错误均输出到 list.txt 当中!
[test @test test]# ls -al 1> list.txt 2> /dev/null
将显示的数据,正确的输出到 list.txt 错误的数据则予以丢弃!
注意!错误与正确档案输出到同一个档案中,则必须以上面的方法来写!
不能写成其它格式!
这里我们来说明一下命令重导向里面几个常用的符号与装置:
    * <  :由 < 的右边读入参数档案;
    * >  :将原本由屏幕输出的正确数据输出到 > 右边的 file ( 文件名称 ) 或 device ( 装置,如 printer )去;
    * >> :将原本由屏幕输出的正确数据输出到 >> 右边,与 > 不同的是,该档案将不会被覆盖,而新的数据将以『增加的方式』增加到该档案的最后面;
    * 2> :将原本应该由屏幕输出的错误数据输出到 2> 的右边去。
    * /dev/null :可以说成是黑洞装置!

      好了,那么为何要使用命令输出重导向呢?这个问题一定会困扰你一下下的,如果你从来都没有写过 script 的话!好了,我们来说一说吧!
          o 当屏幕输出的信息很重要,而且我们需要将他存下来的时候;
          o 背景执行中的程序,不希望他干扰屏幕正常的输出结果时;
          o 一些系统的例行命令(例如写在 /etc/crontab 中的档案)的执行结果,希望他可以存下来时;
          o 一些执行命令,我们已经知道他可能的错误讯息,所以想以『 2> /dev/null 』将他丢掉时;
          o 错误讯息与正确讯息需要分别输出时。

本章习题练习 ( 要看答案请将鼠标移动到『答:』底下的空白处,按下左键圈选空白处即可察看 )
    * 如何显示 HOME 这个环境变量?
      答:
            echo $HOME
              如何得知目前的所有变量与环境变量的设定值?
    *
      答:
            环境变量用 env 而所有变量用 set 即可显示   我是否可以设定一个变量名称为 3myhome ?
    *
      答:
            不行!变量不能以数字做为开头,参考 变量设定规则 的内容   如何取消变量与命令别名的内容?
    *
      答:
            使用 unset 及 unalias 即可
              如何设定一个变量名称为 name 内容为 It’s my name ?
    *
      答:
            name=It\’s\ my\ name 或 name=”It’s my name”
              环境变量档案的加载顺序?
    *
      答:
            先由 /etc/passwd 取得 bash 这个 shell ,再到 /etc/profile 读取主要的环境变量,同时亦会将 /etc/inputrc 及 /etc/profile.d 内容均读入。之后,再到个人的家目录读取 ~/.bash_profile 及 ~/.bashrc 等档案!
              man page 的路径设定档案?
    *
      答:
            /etc/man.config 或 /etc/man.conf   试说明 ‘, “, 与 ` 这些符号在变量定义中的用途?
    *
      答:
            参考变量规则那一章节,其中, “ 可以具有变量的内容属性, ‘ 则仅有一般字符,至于 ` 之内则是可先被执行的指令。
              跳脱符号 \ 有什么用途?
    *
      答:
            可以用来跳脱特殊字符,例如 Enter, $ 等等,使成为一般字符!   连续命令中, ;, &&, || 有何不同?
    *
      答:
            分号可以让两个 command 连续运作,不考虑 command1 的输出状态, && 则前一个指令必需要没有错误讯息,亦即回传值需为 0 则 command2 才会被执行, || 则与 && 相反!
              如何将 last 的结果中,独立出账号,并且印出本月份曾经登入过的账号?
    *
      答:
             last | cut –d “ “ –f
 

 
 
发表于: 2008-05-15 ,修改于: 2008-05-15 02:32,已浏览17次,有评论0条
 
阅读(319) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~