加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

编程语言和shell编程基础

发布时间:2020-12-15 17:05:19 所属栏目:安全 来源:网络整理
导读:编程语言和shell编程基础 bash的特性之多命令执行的逻辑关系: 1.命令替换 command1 $(command2) 2.管道 command1 | command2 |command3..... 3.顺序执行结构 command1 ;command2; command3.... 4.选择执行结构: 如果...那么... 要么...要么... 逻辑运算:


编程语言和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 "

[root@localhost ~]# 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”

[root@localhost ~]# id qhdlink || echo "create user qhdlink"

id: qhdlink: no such user

create user qhdlink


[root@localhost ~]# 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中的空白行行数

[root@localhost ~]# vim 1

#! /bin/bash

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

[root@localhost ~]# . 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]

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

例:

[root@localhost ~]# echo $[3*4]

12


2.let var=expression

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

例:

[root@localhost ~]# let h='3*4'

[root@localhost ~]# echo $h

12


3.$((expression))

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



4.expr ARGU1 ARGU2 ARGU3

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

例:

[root@localhost ~]# expr $[3*4]

12



5.echo "expression" | bc

例:

[root@localhost ~]# echo "3*4" | bc

12

6.bc <<<expression

例:

[root@localhost ~]# 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开头的行

[root@localhost ~]# 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名相同的用户信息;

[root@localhost ~]# 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,...:前向引用

正则表达式处理引擎的内置变量,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

[root@localhost ~]# egrep -o "bin" /etc/passwd

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读