bash脚本编程:
编程?使用人类自然语言或机器语言进行程序源代码书写的过程
为什么要编程?为了能够让用户在使用计算机的时候,可以让计算机以非交互的方式完成某些任务;此时用户需要将此类任务编辑成为一个文件,并且让计算机按照特定书序进行任务读取,从而实现预期的功能
为了让计算机能够解读此类文件的内容并正确的予以执行,必须将程序源代码文件转换为计算机可以直接识别并使用的二进制格式,此转换过程称为编译;而想要完成编译过程,必须使用特定的编译器工具;因此,无论使用何种编译语言进行程序编写,都必须严格按照编译器所能够识别的特定格式和语法结构进行程序编写
编程语言:
高级语言:
编译型语言:
源代码-->编译器(编译)-->[链接器(链接)-->]汇编器(汇编)-->可以执行的二进制代码文件
解释型语言
源代码-->解释器(逐行解释)-->边解释边执行
完整编译语言:
利用库或编程组件进行编程
脚本编程语言:
利用解释器调用被选择的外部应用程序
根据程序的编写规范分类
过程式语言:
程序=指令+数据
以指令为中心,围绕指令的功能实现设计数据和数据结构,数据为指令服务
算法和指令的实现形式
顺序执行
选择执行
循环执行
面向对象语言:
程序=算法+数据结构
以数据和数据结构为中心,将数据实例化,围绕数据的需求来部署算法
类(class):被实例化的数据
属性(attribution):同一类中的不同对象的区分依据
低级语言:
汇编语言
机器语言:
二进制代码
shell脚本编程-bash脚本编程:
过程式编程语言,解释运行的编程语言,脚本类语言(依靠外部应用程序文件运行)
shell脚本是什么?
纯文本文档-文件中所有存储或包含的指令+数据都是以字符为单位进行存储的
是一种具有“执行幂等性”的程序实体
执行幂等性:任何命令的一次执行结果和多次执行结果是一致的
*注意:很多命令都不具备“执行幂等性”,因此在shell脚本中需要使用大量的程序逻辑来判断某个命令是否符合其运行条件,从而避免在运行过程中出现的严重错误
1.首行必须是shebang,即解释器的程序的绝对路径,必须占据绝对行首且必须单独占据第一行,在执行脚本时,会根据shebang的指示,启动相应的解释器以解释脚本被诸多的命令
#!/bin/bash
#!/bin/sh
#!/usr/bin/python
...
2.在shell脚本中,除了shebang之外,所有行首为#字符的行,均被解释为注释行;即解释器只会解释其内容,但并不执行
3.解释器会忽略脚本文件中所有的空白行(在一行文本中,除了空白字符,空格字符,制表字符之外不具备其他任何类型字符的行)
4.大量的命令和关键字
命令:内部或外部应用程序
关键字:内置于shell只能在某种特定结构体中执行的命令;keyword
如:if,else,then,do,while,for,select
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也会被随之销毁;因此,所有在脚本中定义的变量,在脚本的末尾处,最好将其明确的撤销 gc
3.使用source命令运行脚本:
# source /PATH/TO/SOME_SCRIPT_FILE
# . /PATH/TO/SOME_SCRIPT_FILE
注意:
1.source命令不会在运行脚本时开启子shell,而是
2.使用source命令执行的脚本中不要包括诸如exit类的命令
利用bash脚本程序实现算数运算
算数运算操作符:
常用的基本算数运算符:
+,-,*,/,%,**
增强型的算数运算符:
+=,-=,*=,/=,%=
特殊的增强型算数运算符:
++,--
算数运算方法:
1.$[expression]其中的表达式可以是纯数字组成的,也可以使用变量引用变量值:在使用变量时,可以将$符号省略
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: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次,一次或多次
\?:其前面的字符可有可无,即:0次或1次
\+:其前面的字符至少出现一次
\{m,n\}:其前面的字符至少出现m个,最多不超过n个
\{m\}:其前面的字符必须出现m次
\{m,\}:其前面的字符至少出现m次
\{,n\}:其前面的字符出现最多不超过n次
注意:在正则表达式中,表示任意长度的任意字符:.*
位置锚定字符:
行锚定:
行首锚定:^
行尾锚定:$
字锚定:
字首锚定:\<或\b
字尾锚定:\>或\b
分组与前向引用字符:
\(\):将小括号中包含的内容作为不可分割的整体来处理
\1,\2,\3,...:前向引用字符
正则表达式处理引擎的内置变量,\1表示前面所出现的第一组小括号中括选的内容:\2表示前面所出现的第二组小括号中括选的内容;...
或者:
\|:将其左右的字符或字符串当作整体对待;
“C\|cat” == C 或 cat
扩展的正则表达式元字符:ERE
基本的正则表达式元字符:BRE
字符匹配类:
.:匹配任意单个字符
[]:匹配任意指定范围内的单个字符
[^]:匹配任意指定范围内的单个字符
下列所有的字符集都可以放置于[]之中用于匹配字符集范围内的单个字符;
[:lower:]
[:upper:]
[:alpha:]
[:digit:]
[:xdigit:]
[:alnum:]
[:punct:]
[:space:]
[a-z]:仅表示所有的小写字母
[A-Z]:仅表示所有的大写字母
[0-9]:仅表示所有的十进制数码
*:其前面的字符可以出现任意次,即:0次,一次或多次
?:其前面的字符可有可无,即:0次或1次
+:其前面的字符至少出现一次
{m,n}:其前面的字符至少出现m个,最多不超过n个
{m}:其前面的字符必须出现m次
{m,}:其前面的字符至少出现m次
{,n}:其前面的字符出现最多不超过n次
注意:在正则表达式中,表示任意长度的任意字符:.*
位置锚定字符:
行锚定:
行首锚定:^
行尾锚定:$
字锚定:
字首锚定:\<或\b
字尾锚定:\>或\b
分组与前向引用字符:
():将小括号中包含的内容作为不可分割的整体来处理
\1,...:前向引用字符
正则表达式处理引擎的内置变量,\1表示前面所出现的第一组小括号中括选的内容:\2表示前面所出现的第二组小括号中括选的内容;...
或者:
|:将其左右的字符或字符串当作整体对待;
“C|cat” C cat”
grep系:
grep:仅支持基本正则表达式元字符
egrep:可以支持扩展正则表达式元字符
fgrep:不支持任何形式的正则表达式元字符,将所有的字符都视为没有任何特殊意义的普通文本字符
常用选项:
-A num:同时显示被PATTERN匹配到的行及其后续num行
-B num:打印出匹配的行之前的上文
-C num:打印出匹配的行的上下文前后各 NUM 行
--colour[=WHEN]:在匹配的行周围以指定的颜色来标记
-c,--count:不输出被PATTERN匹配的行的内容,而是以输出被PATTERN匹配到的行数
-E,--extended-regexp:可以使用grep命令支持扩展正则表达式元字符;相当于执行了egrep命令
-F,--fixed-strings:相当于fgrep
-e PATTERN,--regexp=PATTERN指定多个
-f FILE,--file=FILE
-i,--ignore-case
-o,--only-matching
-q,--quiet,--silent
-v,--invert-match:只选择不匹配的行