0525 第八节课

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了0525 第八节课相关的知识,希望对你有一定的参考价值。

一.脚本编程基础

   1.脚本是命令的堆积,但是要考虑命令结果的不等次幂

   2.脚本开头必须是shebang,即#!/bin/bash,#!必须顶格,后   面跟shell

   3.行首加上#时既不会显示出来也不会运行,因此在写一些描述版本等信息的时候前边要加上#,调试脚本时不想执行某一命令前边也可以叫上#

   4.空白行默认是不显示的,想要显示空白可以echo “ ”来表达

   5.shell脚本是开启一个子shell运行的

   6.shell运行有两种方式

      a.给脚本以x执行权限

      b.前边加上脚本的解释器,即加上shebang后边的shell,如bash *.sh

   7.脚本的执行分为:顺序执行,循环执行,选择执行

   8.脚本开头


     script



     #!/bin/bash   顶格

     #author:      作者

     #version:     版本(直接以2.0开头)

     #description: 描述脚本的作用


    9.bash -n 检查脚本的内容有没有语法错误

           -x 调试运行,并不真正运行,只是模拟运行,不会对目标做任何处理,会将过程结果输出到屏幕

    10.开机运行的脚本一般放在/etc/profile.d目录下


二.变量

   1.本地变量


     本地变脸只对当前shell有效,且在没有写入到配置文件的本地变量将会在shell关闭后失效,配置文件是/etc/bashrc(全局) ~/.bashrc(个人)

       本地变量的设置

           name=“变量内容”(可以使命令等)

       取消本地变量

           unset name(不需要加$)

       查看变量

           set(包括了环境变量和函数)

       变量的引用

           echo ${}

   2.环境变量


     环境变量的作用对象是当前shell及其子shell,同本地shell,想要永久保存需要写到配置文件中配置文件是/etc/profile (全局) ~/.bash_profile

       环境变量的设置

           export name=“变量内容”

           declare -x name=“变量内容”

           name=“变量内容”   export/declare -x name

       环境变量的取消

           unset name

       查看环境变量

           declare -x 

           export

           env

       引用同本地变量


    3.只读变量

      只读变量只能读取,不能删除,也不能取消,只有在退出shell的失效

        只读变量的设置

          declare -r name=“”

          readonly name


    4.位置变量

      位置变量是想脚本内容传递参数的变量

        jiaoben.sh   s1    s2    s3

        s1   s2   s3都成为jiaoben.sh位置变量

        jiaoben.sh中想要引用可以用$1等引用这些参数


        $1:脚本后边跟的第一个参数,在脚本中用$1来表示

        $2:              二

         .                 .

         .                 .

         .                 .

       注意:$10并不是第10个参数,而是第一个参数加0,第10个参数要用到引用${10}


        [email protected]:指的是后边的全部参数,并且每一个参数都是一个字符串

        $*:值得是后边的全部参数,并且全部参数是一个字符串

        $0:指的是命令本身,但是命令本身是会带路径的,所以,要用basename来取出基名,但是由于是命令所以要用到命令引用`basename $0`

        $#:代指参数的个数



        shift功能:在脚本中需要插入环境变量的上一行加上shift #,会让脚本后边跟的参数整体向左移动#位,默认是移动一位,即第二位及以

        后的参数一起向左移动一位,覆盖住第一位参数,值得注意的是,是覆盖第一位参数,参数项会少一位,并且原先脚本中显示第一个参数

        的$1的内容现在变成第二个参数,以此类推,并不是循环,第一位不会跑到最后一位,脚本中最后一位参数的$*的位置将会为空


三.运算

    因为在shell中都被视为是字符串,所以,10+10是不会被运算的,运算需要用到特殊的格式

    

    运算方式:+加 -减 *乘 %取余(取余是指取前边的数除后边的数的余数,显示的是余数而不是结果) **次幂


    1.expr s1空格+空格s2


    2.echo $[运算表达式]


    3. s1=数值1

       s2=数值2

       s3=$s1 (+-*% **) $s2


       echo $s3 | bc(计算器)



四.sed文本编辑器

    

     sed工作方式:sed是一行一行处理文本的

                                  

                                  保持空间

           file的某一行----------           -----------输出

                                  模式空间



    格式

    sed [options]  ‘script’ file         file.bak文件后边加上.bak可以先制作一个文件的备份


    options

    -i:对文本进行编辑,默认的是不会对原文本有任何更改的,在加了i后所做的一次修改都会被作用到源文件上

    -f:-f/PATH/TO/FILE,可以讲处理的动作命令等写入脚本中,每次从脚本中读取,更利于多文本处理

    -n:不会输出到屏幕,默认的是将处理过的没处理过的都输出到屏幕上

    -e:多点编辑,例如 -e ‘script’ -e ‘script’

    -r:支持正则表达式



    ’script‘

    ’地址命令‘

    a.地址

      #:第几行   

      #1,#2:范围,第#1行到第#2行

      #,#+n:从第#行到第#+n行,n是表示偏移量

      /par1/,/par2/:从正则表达式匹配到的第1行到正则表达式匹配到的第2行

      #,/par/:。。。。。。。。。。

    b.命令

      d:删除行

      p:将修改成工的内容输出到屏幕,不加n的话会有两行一模一样的,因此通常和-n连用

      =:显示行号

      #a\xxxx:在第#行的后面另起一行,内容时XXx

      #i\xxxx:在第#行的前面另起一行,内容时xxx          #可以是正则表达式,但是正则表达式必须用/par/括起来

      #c\xxxx:将第#行的内容替换为xxxx

      w /PATH/TO/FILE 另存为的意思

      r /PATH/TO/FILE 将另一文件的内容读取进来


    c.查找替换

      基本等同于vim中的查找替换

       ’s/查找内容/替换内容/g‘

       同样支持正则表达式,但是前面必须加上-r

       g:全部替换,同vim一样,不加g的话一行中有多个查找内容只会替换第一个

       p:显示成功行,其实和上面那个p就是同一个p

       w /PATH/TO/FILE 另存为


  sed的高级编辑

      -h:将模式空间的内容覆盖到保持空间

      -H:将模式空间的内容追加到保持空间

      -g:将保持空间的内容覆盖到模式空间

      -G:将保持空间的内容追加到模式空间

      -x:将保持空间的内容与模式空间的内容呼唤

      -n:将读取文件的当前行的下一行也一并读取出来覆盖到模式空间

      -N:将读取文件的当前行的下一行也一并读取出来追加到模式空间

      -d:删除一行

      -D:删除多行


      格式:  sed ‘1!N;$!D‘ file

      注意:分号是命令按次序执行的意思,而这段命令在思考是要注意sed是一行一行处理文件的,所以并不是将除了第一行以外的我全部取出

      而是“首先取出1行,看是不是第一行,是则直接送去$!D命令,不是,则执行-N命令将其下一行一同取出追加到这行后边,然后将这两行送

      去执行$!D命令,到了后边,看是不是最后一行,不是,直接删除,是,则保留在当前空间“,因此结果会是文件的最后一行和倒数第二行数

      据





五.find与locate

   

   locate:在数据库中查找,locate会建立一个数据库,里边包含着硬盘的所有文件的名字路径等等信息,locate在搜索的时候,并不是搜索

           硬盘,而是去搜索数据库/var/lib/mlocate/locate.db

           

           locate特性:速度快,不具备实时性,模糊搜索(会将路径中包含字符的文件都找出来)

           

           有时候可能需要用户手动创建这个数据库的情况

           

           更新locate数据库:updatedb,更新数据库是需要读取硬盘上的每一个文件,对于资源的消耗很大,因此手动更新的时候请选择一个闲时

           自动在闲时更新

    -i:不区分大小写

    -b:只显示基名不显示路径中包含字符串的内容

    -r:支持正则表达式

    -c:不显示具体文件只显示数量

    -n #:只显示前#个文件



   find:在整个硬盘中搜索文件,具备实时性,但是消耗资源大,速度相较于locate要慢

     格式

     find 要搜索的位置 选项 处理动作


     要搜索的位置


     选项: -name “名字” :根据名字查找,是精确查找,但是支持通配符

            -iname “   ” :不区分大小写的-name

            -regax name “ ” :支持正则表达的名字查找,但是会将路径中包含的也一同线束出来



            -user

            -group :查找用户或组,支持UID和GID


            -uid

            -gid :用uid gid查找,只支持uid gid

            

            -nouser

            -nogroup :查找无组或者无主的文件




            -type :按类型查找


                    f普通文件 d目录 l连接文件 c字符文件 b块文件 p管道文件 s字符套接文件




            -a:并且的关系

            -o:或的关系

            !/-not:非的关系



            -size[+—]#:按大小查找

                 # (#-1,#]

                 -# [0,#-1]

                 +# (#,oo)

            

            -atime #天

            -ctime

            -mtime 

            

            -amin #分钟

            -cmin

            -mmin

                  #  [#,#+1):#=7 在离现在起整7天的那天起的24个小时之内 0526 9:59   0518 9:59到0519 9.59之间

                  -# [0,#)  :从现在0526 9.59起到0519 9.59之间的时间

                  +# (#,00]::0519 9.59以前修改过的文件




            -perm xxx:精确指定xxx权限的文件

                  /xxx:三类用户的9个权限中有一个符合条件,就是符合条件的文件

                  -xxx:三类用户的权限都同时符合条件的,才是符合条件的文件


                  注意:/xxx -xxx这两者的关系,非-xxx与/xxx互为半否命题





     处理动作

        -print:输出到屏幕,默认的处理动作

        -ls   :对查到的文件执行ll命令

        -fls  :对执行了ll名的查到的文件的列表另存为

        -ok COMMAND {} \;    最查到的文件执行命令,交互模式

        -exec COMMAND {} \; 对查到的文件执行命令,不会要求你确认



        注意:通常用find查到的文件有数十个甚至上千个上万个,但是-ok -exec都是讲文件作为参数全部由命令执行,而

        很多命令并不支持一次性处理那么多的参数,因此很多时候回报错,这时候可以使用xagrs

             

             find | xagrs COMMAND


             xagrs会将find查到的文件一个一个交个命令来处理









六.配置文件

   

   配置文件大致分为两类

     profile类:1.配置环境变量 2.开机运行的一些命令脚本


     bashrc类: 1.配置变量     2.配置命令别名



     用户登录又分为


     交互式登录: 1.su - name切换   2.任何终端登录


     分交互式登录: 1.图形界面下的终端  2.su name切换   3.执行脚本开启的shell



    交互式登录的配置文件读取顺序:/etc/profile----->/etc/profile.d/------->~/.bash_profile----->~/.bashrc------>/etc/bashrc

    非交互时登录配置文件读取顺序:~/.bashrc------>/etc/bashrc-------->/etc/profile.d/


    因此bashrc类的配置文件,无论是交互式还是非交互式登录都要读取(/etc/profile.d/*.sh也是,所以一些需要开机运行的脚本都放在这个目录中)

    退出时要读取的配置文件是:~/.bash_logout

本文出自 “博客作业初版” 博客,谢绝转载!

以上是关于0525 第八节课的主要内容,如果未能解决你的问题,请参考以下文章

2018.11.24 第八节课

第八节课第九节

第八节课

shell 脚本——第八节课 casewhileuntil

第八节课:基本数据结构习题

第八节课-深度学习软件