编程语言和shell编程基础

Posted

tags:

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

                


                编程语言和shell编程基础


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

    1.命令替换

     command1  $(command2)

    2.管道

     command1  | command2  |command3.....

    3.顺序执行结构

     command1 ;command2; command3....

    4.选择执行结构:

     如果...那么...

     要么...要么...


     逻辑运算:

(1) 与:逻辑乘法,1为真,0为假,&&

     1 && 1 = 1

     1 && 0 = 0

     0 && 1 = 0

     0 && 0 = 0

     

    COMMAND1 && COMMAND2


    表示:如果COMMAND1能够成功执行,那么将会执行COMMAND2;

        如果COMMAND1能够执行失败,那么COMMAND2不会执行;

    例: 如果qhdlink用户存在,就输出信息"hello qhdlilnk "

     [[email protected] ~]# id qhdlink && echo "hello qhdlink"

     uid=1001(qhdlink) gid=1006(qhdlink) 组=1006(qhdlink),1004(centos),1005(varnish)

     hello qhdlink

     





   与运算的短路运算法则:只要第一个操作数为FALSE,则其逻辑运算结果为FALSE

  

(2)或: 逻辑加法,||双目操作符

     1 || 1 =1

     1 || 0 =1

     0 || 1 =1

     0 || 0 =0


    COMMAND1 || COMMAND2

            

    表示:只有COMMAND1执行失败,COMMAND2才会执行;

        如果COMMAND1执行成功,COMMAND2不会执行;

    例:如果qhdlink用户存在不输出信息,否则输出信息“create user qhdlink”

    [[email protected] ~]# id qhdlink || echo "create user qhdlink"

    id: qhdlink: no such user

    create user qhdlink


   [[email protected] ~]# id qhdlink || echo "create user qhdlink"

   uid=8099(qhdlink) gid=8099(qhdlink) 组=8099(qhdlink)


   

    或运算逻辑运算法则:只要一个操作数为TURE,则其执行结果为TURE。



(3)非:逻辑取反,1为真,0为假,!,单目操作符

      !1 = 0

      !0 = 1


   命令的状态返回值:

    SUCCESS: 0

    FAILURE: 1-255--FALSE



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

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


     德.摩根定律

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

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


          

 三种逻辑运算的优先级

      !>&&>||

   


   

 bash脚本编程:

   什么叫编程?

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


   为什么要编程? 

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


   为了让计算机能够解读此类文件的内容并正确的执行,必须将程序源代码文件转换为计算机可以直    接识别并使用的二进制格式,该过程为编译,想要完成编译过程,必须使用特定的编译器工具。因    此,无论使用何种编程语言进行程序编写,都必须严格按照编译器所能够识别的特定格式和语法结    构进行程序编写。



   编程语言:

   一.高级语言:

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

        编译型语言:

        源代码-->编译器(编译)-->[链接器(链接)-->]汇编器(汇编)-->可以执行的二进制         代码文件;


        解释型语言

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



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

        完整编程语言:

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

           

        脚本编程语言:

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

     

      3.根据程序编写规范分类:

        过程式语言:

        程序=指令+数据

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

                  

        算法和指令的实现形式:

        顺序执行

        选择执行

        循环执行


        面向对象语言:

        程序=算法+数据结构

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

                           

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

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

        方法(Method):类的正确的操作方法;


      

  二.低级语言:

     

     机器语言:二进制语言


      shell脚本编程-bash脚本编程;


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




     shell脚本到底是什么?

         

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

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

      3.是一种具有“执行幂等性”的程序实体;

       执行幂等性:任何命令的一次执行结果和多次执行结果是一致的;

               

      注意:

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



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

       

      1.首行必须是shebang,即解释器程序的绝对路径,必须占据绝对行首且必须单独占据一行;

       在执行脚本时,会根据shebang的指示,启动相应的解释器以解释脚本诸多的命令:

       #!/bin/bash

       #!/bin/sh

       #!/usr/bin/python

       #!/usr/bin/perl

       ...

    例:统计/etc/grub2.cfg中的空白行行数

     [[email protected] ~]# vim 1

     #! /bin/bash

     grep ^""$ /etc/grub2.cfg | wc -l

     [[email protected] ~]# . 1

     17

           

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


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


      4.大量的命令和关键字

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

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

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


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

                

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



      如何编写shell脚本?

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

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

       通常在Linux的各发行的版本中,推荐使用vim;


       脚本文件的命名方式:

         一般情况下,会为脚本设置“.sh”的名称后缀;比较低版本的编辑工具,会根据文件的          后缀名称来识别是否为shell脚本文件,较高版本的文件工具,如:vim7,无需过多的关          心文件后缀名的问题。

       


       脚本的运行方式:

         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也会被随之销毁;因此,所有在脚本中定义的变量,在脚本       的末尾处最好将其明确的撤销;gc


         3.使用source命令来运行脚本

           # source /PATH/TO/SOME_FILE

           # ./PATH/TO/SOME_SCRLPT_FILE

      

     注意:

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

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



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

       常用的基本算数运算符:

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

    

       增强型的算数运算符:

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

   

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

       ++,--



             

     算数运算方法:

     1.$[expression]  

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

   例:

    [[email protected] ~]# echo $[3*4]

    12


     2.let var=expression

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

   例:

   [[email protected] ~]# let h=‘3*4‘

   [[email protected] ~]# echo $h

   12


     3.$((expression))

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



     4.expr ARGU1  ARGU2  ARGU3

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

   例:

    [[email protected] ~]# expr $[3*4]

    12



     5.echo "expression" | bc

  例:

  [[email protected] ~]# echo "3*4" | bc

  12

    

  

     6.bc <<<expression

  例:

  [[email protected] ~]# bc <<< 3*4

  12




  文本处理工具:

     全屏编辑器:vim,nano

     行编辑器:

     文本处理三剑客: grep系, sed, awk

     grep系:grep, egrep, fgrep,文本搜索工具;基于PATTERN(模式)对于给定的文本文件进行      模糊搜索, grep系所有命令默认工作于贪婪搜索模式;


     sed:Stream EDitor, 流编辑器 ,文本编辑工具;


     awk:文本格式化工具,文件报告生成器,文件处理的编程语言;




      

     grep系:

     grep:Global  Search Regular Expression and Print out the line

         利用正则表达式进行全局搜索并将匹配到的行显示出来;

     

     格式:

         grep [options] PATTERN [FILE...]

         grep [options][-e PATTERN  | -f FILE] [FILE...]

   

     PATTERN:过滤匹配条件,是由没有特殊意义的文本字符或者是正则表达式元字符组成;


     正则表达式的元字符:会被正则表达式处理引擎解释为特殊含义的字符;

      pcre:正则表达式处理引擎,prel语言的正则表达式引擎;


     


     正则表达式的元字符:

     基本的正则表达式元字符:BRE

     字符匹配类:

     .:匹配任意单个字符;

     []:匹配任意指定范围内的单个字符;

     [^]:匹配任意指定范围以外的单个字符;

     下列所有的字符集都可以放置于[]之中用于匹配字符集范围内的单个字符:

     [:lower:]:所有的小写字母;

     [:upper:]:所有的大写字母;

     [:alpha:]:所有字母包括大小写;

     [:digit:]:所有单个的十进制数字;

     [:xdigit:]:

     [:alnum:]:所有的字母和十进制数字;

     [:punct:]:所有的符号;

     [:space:]:表示空白字符,包括空格和制表符;

     [a-z]:仅表示所有的小写字母

     [A-Z]:仅表示所有的大写字母

     [0-9]:仅表示所有的十进制数码


     次数匹配类:该类字符前面的一个字符可以出现的次数;

     *:其前面的字符可以出现任意次,即:0次,1次或多次;

     \?:其前面的字符可有可无,即:0次或1次;

     \+:其前面的字符至少出现一次;

     \{m,n\}:其前面的字符至少出现m次,最多不超过n次;

     \{m\}:其前面的字符必须出现m次;

     \{m,\}:其前面的字符至少出现m次;

     \{,n\}:其前面的字符出现至少出现0次,最多不超n次;




注意:在正则表达式中,表示任意长度的任意字符:.*


    位置锚定字符:

   1. 行锚定:

    行首锚定:^

    行尾锚定:$

   2. 字锚定:

    字首锚定:\<或\b

    字尾锚定:\>或\b

例:找出/proc/meminfo中以S或s开头的行

[[email protected] ~]# grep "^S\|^s" /proc/meminfo

SwapCached:            0 kB

SwapTotal:       1999868 kB

SwapFree:        1999868 kB

Shmem:             13624 kB

Slab:             107464 kB

SReclaimable:      52816 kB

SUnreclaim:        54648 kB


   分组与前向引用字符:

    \(\):将小括号中包含的内容作为一个不可分割的整体来处理;

    \1, \2, \3,...:前向引用

   正则表达式处理引擎的内置变量,\1表示前面所出现的第一组小括号中括选的内容;\2表示前面所    出现的第二组小括号中括选的内容;...


   \(string1\(string2\)\): \1表示string1,\2表示string2;

   \(string1\).*\(string2\):\1表示string1,\2表示string2;

例:找出其用户名与shell名相同的用户信息;

[[email protected] ~]# grep "^\<\(.*\)\>.*\1$" /etc/passwd

sync:x:5:0:sync:/sbin:/bin/sync

shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

halt:x:7:0:halt:/sbin:/sbin/halt

bash:x:8093:8093::/home/bash:/bin/bash

nologin:x:8096:8096::/home/nologin:/sbin/nologin


   或者:

   \|:将其左右的字符或字符串当做整体对待;

   "C\|cat"  C  cat

例:找出ifconfig命令执行结果中的两位或三位整数;

# ifconfig | grep "\<[1-9][0-9]\>\|\<[1-9][0-9][0-9]\>"

   

 扩展的正则表达式元字符:ERE

   字符匹配类:

   .:匹配任意单个字符;

   []:匹配任意指定范围内的单个字符;

   [^]:匹配任意指定范围以外的单个字符;

   下列所有的字符集都可以放置于[]之中用于匹配字符集范围内的单个字符:

   [:lower:]:所有的小写字母;

   [:upper:]:所有的大写字母;

   [:alpha:]:所有的字母,包括大小写;

   [:digit:]:所有单个的十进制数字;

   [:xdigit:]:

   [:alnum:]:所有的字母和十进制数字;

   [:punct:]:所有的符号;

   [:space:]:表示空白字符,包括空格和制表符;

   [a-z]:仅表示所有的小写字母

   [A-Z]:仅表示所有的大写字母

   [0-9]:仅表示所有的十进制数码


   次数匹配类:该类字符前面的一个字符可以出现的次数;

   *:其前面的字符可以出现任意次,即:0次,1次或多次;

   ?:其前面的字符可有可无,即:0次或1次;

   +:其前面的字符至少出现一次;

   {m,n}:其前面的字符至少出现m次,最多不超过n次;

   {m}:其前面的字符必须出现m次;

   {m,}:其前面的字符至少出现m次;

   {,n}:其前面的字符出现至少出现0次,最多不超n次;


 注意:在正则表达式中,表示任意长度的任意字符:.*


  位置锚定字符:

  行锚定:

  行首锚定:^

  行尾锚定:$


  字锚定:

  字首锚定:\<或\b

  字尾锚定:\>或\b


  分组与前向引用字符:

  ():将小括号中包含的内容作为一个不可分割的整体来处理;

  \1, \2, \3,...:前向引用

 正则表达式处理引擎的内置变量,\1表示前面所出现的第一组小括号中括选的内容;\2表示前面所出  现的第二组小括号中括选的内容;...


  (string1(string2)): \1表示string1,\2表示string2;

 (string1).*(string2):\1表示string1,\2表示string2;


  或者:

  |:将其左右的字符或字符串当做整体对待;

  "C|cat"  C  cat


 grep系:

 grep:仅支持基本正则表达式元字符

 egrep:可以支持扩展正则表达式元字符

 fgrep:不支持任何形式的正则表达式元字符,将所有的字符都视为没有任何特殊意义的普通文本字       符;


 常用选项:

 -A num:同时显示被PATTERN匹配到的行及其后续num行;

 -B num:同时显示被PATTERN匹配到的行及其前面num行;

 -C num:同时显示被PATTERN匹配到的行及其前后num行;

 --color[=WHEN]:以高亮颜色显示被匹配到的内容;

 -c, --count:不输出被PATTERN匹配的行的内容,而是输出被PATTERN匹配到的行数;

 -E, --extended-regexp:可以使grep命令支持扩展正则表达式元字符;相当于执行了egrep命令;

 -F, --fixed-strings:相当于fgrep;

 -e PATTERN, --regexp=PATTERN:指定多个PATTERN在一个命令行中生效;

 -f FILE, --file=FILE:从指定的文件中读取多个PATTERN用于一次搜索;

 -i, --ignore-case:忽略文件中的字符的大小写;

 -o, --only-matching:仅显示被PATTERN匹配到的部分,关闭贪婪模式;

 -q, --quiet, --silent:安静模式;相当于 grep > /dev/null

 -v, --invert-match:显示没有被PATTERN匹配到的行;

例:输出/etc/passwd中的bin

  [[email protected] ~]# egrep -o "bin" /etc/passwd 

 



















本文出自 “计算机基础” 博客,转载请与作者联系!

以上是关于编程语言和shell编程基础的主要内容,如果未能解决你的问题,请参考以下文章

编程语言和shell编程基础

shell编程基础

1.1Shell脚本编程基础

linux12shell编程 --> shell基础01

shell脚本编程基础

SHELL脚本编程基础