linux总结-------BASH Shell(1)

来源:互联网 发布:淘宝蓝钻cdk没有了 编辑:程序博客网 时间:2024/04/30 14:00

一. 变量与变量的设定:echo,env,set,变量设定规则,export,unset

echo
显示变量内容

语法[test @testtest]# echo $variable
参数说明:
范例:
[test @testtest]# echo $PATH
/bin:/sbin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin:/usr/loc
al/bin:/bin:/usr/bin:/usr/X11R6/bin就如同上面的范例,当我们要显示目前的 PATH 这个变量时,使用了 echo ,而为了要分辨是否为变量,那么Linux 系统预设变量名称前面会加上一个『 $ 』符号,所以就必须要写成echo $PATH 啰!例题:请在屏幕上面显示出您的环境变量 PATH, HOME 与 MAIL:
答:
[root@test root]#echo $PATH
/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin:/usr/local/bin:/usr/local/sbin
[root@test root]# echo $HOME
/root
[root@test root]# echo $MAIL

/var/spool/mail/root

env
显示目前系统中主要的预设变量内容

  • set
    显示目前系统中全部的变量内容


    变量设定规则:
    1. 变量与变量内容以等号『=』来连结;
    2. 等号两边不能直接接空格符;
    3. 变量名称只能是英文字母与数字,但是数字不能是开头字符;
    4. 若有空格符可以使用双引号『 " 』或单引号『 ' 』来将变量内容结合起来,但须要特别留意,双引号内的特殊字符可以保有变量特性,但是单引号内的特殊字符则仅为一般字符;
    5. 必要时需要以跳脱字符『 \ 』来将特殊符号(如Enter,$, \, 空格符, '等)变成一般符号;
    6. 在一串指令中,还需要藉由其它的指令提供的信息,可以使用quote 『 ` command`』;
    7. 若该变量为扩增变量内容时,则需以双引号及 $变量名称如:『 "$PATH":/home』继续累加内容;
    8. 若该变量需要在其它子程序执行,则需要以 export 来使变量可以动作,如『exportPATH』;
    9. 通常大写字符为系统预设变量,自行设定变量可以使用小写字符,方便判断(纯粹依照使用者兴趣与嗜好);
    10. 取消变量的方法为:『unset变量名称』。

    底下我们举几个例子来说明一下:
     一般变量设定:
    [tets @testtest]# 12name=VBrid          <==错误的!因为变量开头不能是数字!
    [test @testtest]# name = VBird                 <==错误的!因为等号两边不能直接接空白!
    [test @testtest]# name=VBird                   <==正确的!echo $name 显示 VBird
    [test @testtest]# name=VBird name          <==错误的!需要加上双引号!不然会显示错误!
    [test @testtest]# name="VBird name"            <==正确的!echo $name 显示 VBird name
    [test @testtest]# name="VBird's name"         <==正确的!

    变量累加设定:
    [test @testtest]# name=$nameisme        <==错误的!需要以双引号将原变量圈起来
    [test @testtest]# name="$name"isme      <==正确的!echo $name 显示 VBird's nameisme
    [test @testtest]# PATH="$PATH":/home/test      <==正确的!echo $PATH 将多了后面一句话!
    [test @testtest]# PATH="$PATH:/home/test"      <==正确的!这个形式对于 PATH 来说也是正确的格式!

    变量延伸到下一个子程序:
    [test @testtest]# name="VBird's name"    <==设定 name 这个变量
    [test @tsettest]# echo $name                <==显示 name 变量的指令
    [test @testtest]# VBird's name
    [test @testtest]# /bin/bash                 <==另开一个 bash 的子程序
    [test @tsettest]# echo $name                <==显示 name 这个变量
    [test @tsettest]#                       <==会显示空字符串因为 name 这个变量不能使用在子程序
    [test @testtest]# exit                      <==退出子程序 bash shell !
    [test @testtest]# export name               <==正确的!如此则 $name 可以用于下一个子程序中!

    指令中的指令:
    [test @testtest]# cd /lib/modules/`uname –r`/kernel
    上式中,会先执行`uname –r` 这个内含指令,然后输出的结果附加在 /lib/module… 里面,所以执行这个指令,可以完成几个附指令程序!

    取消变量设定:
    [test @testtest]# unset name

     
    根据上面的案例你可以试试看!就可以了解变量的设定啰!这个是很重要的呦!请勤加练习!!其中,较为重要的一些特殊符号的使用啰!例如单引号、双引号、跳脱字符、钱字号、quote符号等等,底下的例题想一想吧!
     
    例题:在变量的设定中,单引号与双引号有什么不同呢?
    答:
    单引号与双引号的最大不同在于双引号仍然可以保有变量的内容,但单引号内仅能是一般字符,而不会有特殊符号。我们以底下的例子做说明:假设您定义了一个变量,name=VBird ,现在想以 name 这个变量定义出 myname 显示 VBird its me 这个内容,要如何订定呢?
    [root @test root]#name=VBird
    [root @test root]# echo $name
    VBird
    [root @test root]# myname="$nameits me"
    [root @test root]# echo $myname
    VBird its me
    [root @test root]# myname='$nameits me'
    [root @test root]# echo $myname
    $name its me
    发现了吗?没错!使用了单引号的时候,那么 $name 将失去原有的变量内容,仅为一般字符的显示型态而已!这里必需要特别小心在意!
     例题:在指令下达的过程中, quote ( ` ) 这个符号代表的意义为何?
    答:
    在一串指令中,在 ` 之内的指令将会被先执行,而其执行出来的结果将做为外部的输入信息!例如uname –r 会显示出目前的核心版本,而我们的核心版本在 /lib/modules 里面,因此,你可以先执行uname –r 找出核心版本,然后再以『 cd 目录』到该目录下,当然也可以执行
    cd /lib/modules/`uname–r`
    直接到该目录下去!
    例题:在指令下达的过程中, quote ( ` ) 这个符号代表的意义为何?
    答:
    在一串指令中,在 ` 之内的指令将会被先执行,而其执行出来的结果将做为外部的输入信息!例如uname –r 会显示出目前的核心版本,而我们的核心版本在 /lib/modules 里面,因此,你可以先执行uname –r 找出核心版本,然后再以『 cd 目录』到该目录下,当然也可以执行
    cd /lib/modules/`uname–r`
    直接到该目录下去!
    export
    当你取得一个 bash 之后,亦即得到了一个程序了,但是若你再次的执行一次bash ,那么你将进入『子程序』,这个程序的概念我们在资源管理章节中再详谈,这里您先有个概念即可。那么由于您已经进入了该子程序,所以在父程序中的变量设定将不再继续的存在。如您想要让该变量内容继续的在子程序中使用,那么就请执行:
     
      export 变数
     
    !这个东西用在『引用他人的档案或者其它程序』时,相当的重要的!尤其像我常常两三个档案互相引用来引用去的,如果忘记设定export 的话,那么不同的档案中的相同变量值,将需要一再地重复设定才行!所以,我只要在头一个档案使用export 的话,那么后续的档案引用时,将会把该变量内容读进来!好用的很?而,如果仅下达export 而没有接变量时,那么此时将会把所有的『环境变量』秀出来喔!也就是说,export可以将一般自订的变量变成环境变量

    • unset
      就是直接将该变量的内容拿掉:
       
        unset 变数


    • 变量的有效范围:
      由前面的 export 以及相关的说明,你可以很清楚的知道一件事情,那就是,『变量的设定只在目前这个shell 环境当中存在,在下个或者是在子程序中 ( 子 shell ) 将不会存在!』要让变量在下个程序也可以继续的使用,大概就是使用export这个咚咚啦!此外,其实除了 shell 的父、子程序外,在脚本( scripts )的编写当中,由于有的软件会使用到2 个以上的 scripts 做为一个完整的套件!也就是说,假如你有两支程序,一支为scripts1.sh 以及 scripts2.sh ,而 scripts2.sh 会去引用 scripts1.sh 的变数,这个时候,嘿嘿!你在scripts1.sh 当中设定的变量请『千万记得以 export 设定』,否则你的变量将无法在两个scripts 之间互相被引用喔!当这个 scripts 执行完毕之后,刚刚在 scripts 当中设定的变量也就『失效了!』。

    read:
    上面我们谈到的『变量』都是由『指令列』直接设定好的!那么可不可以随时来提供使用只以键盘随时输入变量内容?也就是说,变量内容是由使用者由键盘输入的哩!呵呵!可以使用read 来达成喔!这个东西在『 script 』里面比较重要啦!所以我们在 shell script里面会再次的提到喔!
    语法[test @testtest]#read name
    testing <==这个时候屏幕会等待使用者由键盘输入喔!
    [test @testtest]# echo $name
    testing <==刚刚输入的数据变成了变量的内容啦! 


    万用字符与特殊符号
      由于在 bash 当中常会使用到一些万用字符,与搭配特殊符号来将指令做更好的利用(例如最常提到的正规表示法Regulare Express )!底下我们列出一些常用的万用字符与特殊符号:
       
      符号
      内容
      *
      万用字符,代表一个或多个字符(或数字)
      ?
      万用字符,代表一个字母
      #
      批注,这个最常被使用在 script 当中,视为说明!
      \
      跳脱符号,将『特殊字符或万用字符』还原成一般字符
      |
      分隔两个管线命令的界定
      ;
      连续性命令的界定(注意!与管线命令并不相同)
      ~
      使用者的家目录
      $
      亦即是变量之前需要加的变量取代值
      &
      将指令变成背景下工作
      !
      逻辑运算意义上的『非』 not 的意思!
      /
      路径分隔的符号
      >, >>
      输出导向,分别是『取代』与『累加』
      '
      单引号,不具有变量置换的功能
      "
      具有变量置换的功能!
      ` `
      两个『 ` 』中间为可以先执行的指令!
      (   )
      在中间为子 shell 的起始与结束
      [  ]
      在中间为字符的组合
      {   }
      在中间为命令区块的组合!
      组合按键
      执行结果
      Ctrl + C
      终止目前的命令
      Ctrl + D
      输入结束(EOF),例如邮件结束的时候;
      Ctrl + M
      就是 Enter 啦!
      Ctrl + S
      暂停屏幕的输出
      Ctrl + Q
      恢复屏幕的输出
      Ctrl + U
      在提示字符下,将整列命令删除
      Ctrl + Z
      『暂停』目前的命令

      上面的万用字符当中,最常用的就属 *, ?, [] 及 ` 了!我们提几个简单的例子:
       [test @testtest]# ls test* <==那个 * 代表后面不论接几个字符都予以接受(没有字符也接受!)
      [test @testtest]# ls test? <==那个 ? 代表后面『一定』要接『一个』字符
      [test @testtest]# ls test??? <==那个 ??? 代表『一定要接三个』字符!
      [test @testtest]# cp test[1-5] /tmp <==将 test1,test2, test3, test4, test5 若存在的话,就拷贝到 /tmp 下
      [test @testtest]# cd /lib/modules/`uname -r`/kernel/drivers <==被` ` 括起来的内容『会先执行』!上面几个例子相当的有趣!尤其是最后面两个!需要注意的是, [] 里面『代表只有一个字符』但是范围可以由1-5 ,这样来说的话,那么我们如果允许『只要档名里面含有至少一个大写字符』时,就可以将档案copy 出来的话,可以这样做:
       

        cp *[A-Z]* /tmp
       
      很有趣吧?! ^_^
      此外,那个 `` 里面的『指令』会先被执行,也就是说:
       
      1. 系统先执行 uname -r 找出输出的结果;
      2. 将结果累加在目录上面,来执行 cd 的功能!
       
      很棒吧!!这些基本的功能需要特别来了解一下才行呦!



原创粉丝点击