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

1.命令替换

COMMAND1 $(COMMAND2)

2.管道

COMMAND1 | COMMAND2 | COMMAND3 ...

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

命令的执行状态返回值:

SUCCESS:0--TURE(true)

FAILURE:1-255--FALSE(false)

COMMAND1 && COMMAND2

表示:

1.如果COMMAND1能够成功执行,那么将会执行COMMAND2;

2.如果COMMAND1执行失败,那么COMMAND2将不会被执行;

COMMAND1 || COMMAND2

表示:

1.只有COMMAND1执行失败,COMMAND2才会被执行;

2.如果COMMAND1执行成功,那么COMMAND2就不会被执行;

!COMMADN1 && 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):被实例化的数据;

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

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

低级语言:

汇编语言:

机器语言:二进制语言

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

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

shell脚本到底是什么?

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

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

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

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

注意:

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

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

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

#!/bin/bash

#!/bin/sh

#!/usr/bin/python

#!/usr/bin/perl

...

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,无需过多的关系文件后缀名的问题。

脚本的运行方式:

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

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

# source /PATH/TO/SOME_SCRIPT_FILE

# . /PATH/TO/SOME_SCRIPT_FILE

注意:

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

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

练习:写一个脚本:

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

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

算术运算操作符:

常用的基本算术运算符:

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

增强型的算术运算符:

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

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

++,--

算术运算方法:

1.$[expression]

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

示例:

# echo $[3+4]

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

2.let VAR=EXPRESSION

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

3.$((EXPRESSION))

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

4.expr ARGU1 ARGU2 ARGU3

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

5.echo "EXPRESSION" | bc

6.bc <<< EXPRESSION

文本处理工具:

全屏编辑器: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次;

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

位置锚定字符:

行锚定:

行首锚定:^

行尾锚定:$

字锚定:

字首锚定:\<或\b

字尾锚定:\>或\b

分组与前向引用字符:

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

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

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

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

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

或者:

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

"C\|cat"  C  cat

扩展的正则表达式元字符: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匹配到的行;

转载于:https://blog.51cto.com/weidehong/1982797

编程语言和shell编程的基础内容以及grep、egrep命令及相应的正则表达式和用法...相关推荐

  1. 200G超强C语言和C++编程0基础从入门到精通视频教程,立即获取

    当今只有一种语言的性能比C语言强,那就是汇编语言,优化过的C程序的速度大约是汇编的95%-98%.但汇编基本不是常人用的.所以实际上C就是最快的语言.C是面向过程的编程语言,C++在某种意义上来说是C ...

  2. python与c语言在语法上的区别-C语言和Python编程先学习哪个

    原标题:C语言和Python编程先学习哪个 初学者,Python和C语言先学哪个好? 就像是"先有鸡还是先有蛋一样",先学python还是先学C语言,这也是个世纪难题. 这种纠结并 ...

  3. java程序设计 c语言_C语言和Java编程有什么区别?

    C语言和Java编程有什么区别?Java从根本上说是c之后的一种改进语言,纯面向对象的一种编程语言(当然比起Ruby还是差一点),有了C语言的基础固然对学习Java有帮助,因为在某种程度上Java和C ...

  4. shell编程入门、shell编程的基础知识(变量、命令、运算)、shell编程的语句

    shell编程 示例1 ex1 文件内容如下: #!/bin/sh #This is to show what a example looks like. echo "My First Sh ...

  5. php编程用空格,shell 编程中空格的使用方法

    1.定义变量时, =号的两边不可以留空格.eg: gender=femal----right gender =femal---–wrong gender= femal---–wrong 2.条件测试语 ...

  6. 【翻译】C#编程语言和JAVA编程语言的比较(下)

    原文地址:http://www.25hoursaday.com/CsharpVsJava.html 6.集合 许多有名的编程语言都会包含一个集合框架,框架一般由各种用于保存数据的数据结构和配套的操作对 ...

  7. c语言和c 编程的区别吗,C语言和C有什么区别呀?

    简单地说,它们不是一种语言,语法有差别,编程时具体用到的类库或者函数库也不一样. 虽然它们不是一种语言,不过它们却也有所联系.广泛地说,C可以看作其他三种语言的源语言,因为其他三种语言几乎都是从C而来 ...

  8. UR机器人C语言和Python编程控制

    UR机器人编程控制 一.通过 TCP/IP 进行远程控制 二.UR机器人通信端口类型 2.1.Modbus TCP端口(502端口) 2.2.C语言上位机编程端口(30001/30002/30003端 ...

  9. Hadoop系列之三:函数式编程语言和MapReduce

    1.MapReduce和大数据问题 海量数据并行处理的核心思想无非是将一个较大的问题进行"分割包围.逐个歼灭".然而其难点和关键点在于如何将一个大的问题分分割成多个可以分别在不同的 ...

最新文章

  1. 从源码分析DEARGUI之add_progress_bar
  2. python测试开发自学教程-Web开发哪家强?看我用 Python 写一个颜值测试小工具
  3. C语言再学习 -- C 预处理器
  4. 三国志9加强版孙权情之章攻略-赤壁之战
  5. git推送本地分支到远程分支
  6. 总结verilog产生随机数的$random和seed
  7. .net 读取mysql数据库配置文件_.NETCore添加及读取默认配置文件信息
  8. php写不了php,php写入内存不足怎么办
  9. (15)FPGA面试题存储器资源区别
  10. SpringBoot启动流程解析
  11. Keepalived相关参数说明
  12. Linux C++使用MySQL数据库
  13. 20210803:AXI-Stream协议源码分析初探
  14. MemCache在Windows下环境的搭建及启动
  15. win10系统文件拖拽卡顿_IT技巧分享16:如何让win10摆脱卡顿
  16. 基于基本面因子的量化交易模型解析
  17. Tomcat+Nginx动静分离
  18. vue 打印出现多余空白页的情况
  19. 一个无线遥控通讯协议破解实例
  20. 【ORACLE数据库体系架构】

热门文章

  1. SpringBoot实战(五):配置健康检查与监控
  2. 伊拉克博士深陷战区要耽搁毕业论文,瑞典导师派武装雇佣兵救他全家
  3. DeepMind深度学习高级课程,视频已全部放出
  4. 4.5亿!依图的AI芯片计划初步浮出水面
  5. 2019年上海地区最新JAVAEE开发面试与笔试题
  6. 让世界没有陌生的角落共享单车时代的快与慢
  7. 什么是交叉编译?个人对交叉编译的理解
  8. 企业创新系列之:雨巷邂逅
  9. Tokyo Tyrant优势
  10. 用C#制作PDF文件全攻略 (专至csdn)