bash特性中多命令执行的逻辑关系和bash脚本编程之编程

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bash特性中多命令执行的逻辑关系和bash脚本编程之编程相关的知识,希望对你有一定的参考价值。

bash的特性之多命令执行的逻辑关系:

  1.命令替换

    COMMAND1  $(COMMAND2)    (先执行COMMAND2,把COMMAND2的执行结果传递给COMMAND1来执行)

  2.管道

    COMMAND1 | COMMAND2 | COMMAND3  ...    (先执行COMMAND1命令,再把命令结果传递给COMMAND2,无论命令是否有效,只会执行下去,依次类推)

  3.顺序执行结构

    COMMAND1 ; COMMAND2 ; COMMAND3  ...    (按先后顺序执行,无论执行结果是否有效)


    注意:区分使用 | 和 ; ,有执行结果且标准输出的用 | ,没有标准输出的使用 ; 。


  4.选择执行结构:

      如果...那么...

      要么...要么...

      逻辑运算:

         与:逻辑乘法,1代表真,0代表假,&&是运算符号(双目操作符)

           1 && 1 = 1

           1 && 0 = 0

           0 && 1 = 0

           0 && 0 = 0

           "与"运算的短路运算法则:只要第一个操作数为false,则逻辑运算结果一定为false;(只要一个为假,结果就是假)


         或:逻辑加法,1代表真,0代表假,||(双目操作符)

           1 || 1 = 1

           1 || 0 = 1

           0 || 1 = 1

           0 || 0 = 0

           "与"运算的短路运算法则:只要第一个操作数为true,则逻辑运算结果一定为true; (只要一个为真,结果就是真)


         非:逻辑取反,1代表真,0代表假,! ,单目操作符

           !0 = 1

           !1 = 0


      命令的执行状态返回值(操作命令:echo $?):

        SUCCESS: 0代表TRUE真

        FAILURE: 1-255代表FALSE假


         COMMAND1  && COMMAND2

         表示:如果COMMAND1能成功执行,那么将会执行COMMAND2,反之COMMAND1不能执行,那么COMMAND2没有执行的必要

         COMMAND1  || COMMAND2

         表示:只有COMMAND1执行失败,COMMAND2才会执行;COMMAND1执行成功,COMMAND2不会被执行

         !COMMAND1  && COMMAND2  相当于  COMMAND1  || COMMAND2 (这里的非运算符号!只针对命令执行的状态返回值的真假)

         !COMMAND1  || COMMAND2  相当于  COMMAND1  && COMMAND2

         (这两种为德摩根定律中的两种)


         德摩根定律:

         !(COMMAND1  && COMMAND2) || COMMAND3

         !(COMMAND1  || COMMAND2) && COMMAND3


         !A  && B = A || B

         !A  && B = A && B


         !(A  && B) = !A || !B

         !(A  || B) = !A && !B


       三种逻辑运算的优先级:

         !(非运算)>$$(与运算)>||(或运算)   

         有括号先算扩号内


       示例:

         如果用户user4存在并且其家目录也存在,那么就执行userdel -r user4命令;

         id user4 &&  ls -d /home/user4  && userdel -r user4

         技术分享



bash脚本编程:

   什么叫编程?

      使用人类自然语言或机器语言进行程序源代码书写的过程。

   为什么编程?

      易于人类在使用计算机的时候,可以让计算机以非交互的方式完成某些任务,此时用户需要将此类任务编辑成为一个文件并且让计算机按照特定的顺序进行任务读取加载,从而实现我们预期的功能。

   什么叫编译?   

      为了让计算机能够解读此类文件的内容并正确执行,必须将程序源代码文件转换为计算机可以识别并使用的二进制格式,此过程叫做编译;

      而想要完成编译过程,必须使用特定的编译器工具。因此无论使用何种语言进行程序编写都必须严格按照编译器所能够识别的特定格式和语法结构进行程序编写。



   编程语言:

      高级语言:

        根据源代码的处理方式分类:

          编译型语言:

            源代码-->编译器(编译)-->[链接器(链接)-->]汇编器(汇编)-->可以执行的二进制代码文件 (“[]”内代表这一步骤可以省略)

          解释型语言:

            源代码-->解释器(逐行解释)-->边解释边执行

        根据编程过程中的功能实现是调用库还是调用外部程序文件分类:

           完整编程语言:

               利用库或编程组件进行编程

           脚本编程语言:

               利用解释器调用被选择的外部应用程序

        根据程序的编写规范分类:

           过程式语言:

              程序 = 指令 + 数据

              以指令为中心,围绕指令的功能实现设计数据和数据结构,数据为指令服务;

              算法和指令的实现形式:

                顺序执行

                选择执行

                循环执行

           面向对象语言:

             程序 = 算法 + 数据结构

             以数据和结构为中心,将数据实例化,围绕数据的需求来部署算法;

                类(class):被实例化的数据

                属性(attribution):同一类中的不同对象的区分依据

                方法(method):类的正确操作方法


      低级语言:

          汇编语言


      机器语言:二进制语言



  shell脚本编程——bash脚本编程:

    过程式编程语言,解释运行的编程语言,脚本类语言(依靠外部应用程序文件运行)


  shell脚本是什么?

    1.纯文本文档——文件中所有存储或包含的 数据+指令 都是以字符为单位进行存储的;

    2.根据用户的需求来解决用户问题的简单或复杂的命令组合体;

    3.是一种具有“执行幂等性”的程序实体;(执行幂等性:任何目录的额一次执行结果和多次执行结果是一致的)

          注意:很多的命令都不具备“执行幂等性”,因此在shell脚本中我们需要大量的程序逻辑来判断某个命令是否符合其运行条件,从而避免在运行过程中出现的严重错误。



  shell脚本中的代码内容如何书写?

    1.首行必须是shebang,shebang即解释器的绝对路径,而且必须占据绝对行首且单独占据第一行;在执行脚本时,会根据shebang的指示,启动相应的解释器以解释脚本被诸多的命令;

    2.在shell脚本中除了shebang之外,所有以#作为起始行的,均被解释为注释行;即:解释器只会解释其内容,但不予以执行;

    3.解释器会忽略脚本文件中所有的空白行;空白行指的是在一行文本中除了空白字符、空格字符、制表字符之外不具备其他类型字符的行;

    4.大量的命令和关键字

       命令:内部或外部应用程序

       关键字:内置于shell,只能在某种特定结构体中执行的命令;keyword;

          如:if,else,then,do,while,for,select,until,case,fi,esac...

    5.shell中的所有的特殊功能字符;


    注意:所有被编写进shell脚本文档的命令、关键字及符号必须是ASCII编码格式的字符,其他编码格式的字符可以出现在shell脚本文件中,但是不具有特殊含义。


  如何编写shell脚本?

    可以利用所有的文本文档编辑工具进行shell脚本编写,如:

      nano,vi,vim,pico,emacs...

      通常在Linux各个发行版本中,推荐使用vim(高亮,自动换行,加色标记等);


  脚本文件的命名方式

    一般情况下,会为脚本设置“.sh”的名称后缀;较低版本的编辑工具,会根据后缀名称来识别是否为shell脚本文件,较高版本的文本编辑工具,如vim7则可以忽略这样的名称差异,无须过多的关心文件的后缀名的问题;


  shell脚本的运行方式

    1.为脚本文件赋予执行权限,可以直接以绝对路径或相对路径的方式来运行此文件;

        # chmod +x /PATH/TO/SOME_SCRIPT_FILE

        # /PATH/TO/SOME_SCRIPT_FILE


        注意:如果脚本文件所在的目录路径存储于PATH变量中免责直接以脚本文件名来执行即可;


    2.直接使用解释器来运行脚本,将脚本文件作为解释器程序的参数;

        # bash /PATH/TO/SOME_SCRIPT_FILE

          bash命令的常用选项:

            -x:使bash在解释脚本的过程展示在标准输出上;一般用于为shell脚本排错

            -n:对脚本文件进行预执行,以分析脚本中是否存在语法类错误;如果没有错误,则不输出任何信息;相反,则输出简洁的提示信息;具体的错误定位需要自行判断;


        注意:此种方式中,脚本文件是否有执行权限并不是很重要的属性


    注意:以上两种方式在执行脚本时,会在当前shell中开启一个子shell来运行脚本(不会影响当前shell内的执行结果,一般情况下,当脚本运行结束没改子shell也会被随之销毁)因此,所有在脚本中定义的变量在脚本的末尾处最好将其明确的撤销(unset命令撤销);gc内存回收机制


    3.source命令来运行脚本:

      # source  /PATH/TO/SOME_SCRIPT_FILE

      # ./PATH/TO/SOME_SCRIPT_FILE   (这里的“.”代表source)


      注意:

        1.source命令不会在运行脚本时开启子shell,而是在当前shell中运行;

        2.使用source命令执行的脚本中不要包括诸如exit类的命令;


 

练习:写一个脚本:

    当alex用户不存在时,创建之;如果创建成功,则显示成功创建的提示信息,否则显示用户已存在。


    #!/bin/bash

    #

    ! id alex && useradd alex && echo "Creat user alex finished." || echo "User alex exists already"

    结果如下:

     技术分享



利用bash脚本程序实现算数运算:

 算数运算操作符:

  常用的基本算数运算符:

    +,-,*,/,%(取余),**(乘方)


  增强型的算数运算符:

   +=,-=,*=,/=,%=


  特殊的增强型算数运算符:

    ++,--

 

 算数运算方法:

   1.$[expression]     

      其中的表达式可以是纯数字组成的也可以使用变量引用变量值;在使用变量时,可以将$符号省略;

      示例:

        # echo $[3+4]

         技术分享

        # NUM1=5 ; NUM2=4 ; echo $[NUM1*NUM2]

         技术分享

   2.let VAR=EXPRESSION

     根据算数表达式完成算数运算并赋值给指定变量;

    技术分享

   3.$((EXPRESSION))

     其中的表达式可以是纯数字组成的也可以使用变量引用变量值;在使用变量时,可以将$符号省略;

     (这项的使用方法与$[expression]一致,只是符号不相同)

   4.expr ARGU1 ARGU2 ARGU3

     其中ARGU1和ARGU3必须是整数值;ARGU2是算数运算符;

     技术分享

    在上图中,*前面的反斜线是为了使用*的本来意思

   5.echo "EXPRESSION" | bc

      echo "scale=3;35/9" | bc

      3.888

    技术分享

     scale=3在这里是保留三位小数的意思,两个命令之间需要使用;隔开,再使用管道将命令送于bc计算器计算

   6.bc <<< "EXPRESSION"

     bc <<< "scale=3;35/8"

     3.888

    技术分享

    <<<符号表示将后面的式子送于前面的计算器bc


本文出自 “陈梁的博客” 博客,谢绝转载!

以上是关于bash特性中多命令执行的逻辑关系和bash脚本编程之编程的主要内容,如果未能解决你的问题,请参考以下文章

bash中多命令的执行关系

bash特性之逻辑运算和shell脚本的编写

bash的多命令执行,shell脚本基础及grep系

bash脚本编程与正则表达式

shell脚本基础-bash变量和逻辑运行

bash脚本总结