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

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,...:前向引用

正则表达式处理引擎的内置变量,\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匹配到的行;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


用的openwrt路由器,家里宽带申请了动态公网ip,为了方便把2280端口映射到公网,发现经常被暴力破解,自己写了个临时封禁ip功能的脚本,实现5分钟内同一个ip登录密码错误10次就封禁这个ip5分钟,并且进行邮件通知使用步骤openwrt为19.07.03版本,其他版本没有测试过安装bashmsmtpopkg
#!/bin/bashcommand1&command2&wait从Shell脚本并行运行多个程序–杨河老李(kviccn.github.io)
1.先查出MAMP下面集成的PHP版本cd/Applications/MAMP/bin/phpls-ls 2.编辑修改.bash_profile文件(没有.bash_profile文件的情况下回自动创建)sudovim~/.bash_profile在文件的最后输入以下信息,然后保存退出exportPATH="/Applications/MAMP/bin/php/php7.2.20/b
1、先输入locale-a,查看一下现在已安装的语言2、若不存在如zh_CN之类的语言包,进行中文语言包装:apt-getinstalllanguage-pack-zh-hans3、安装好后我们可以进行临时修改:然后添加中文支持: locale-genzh_CN.UTF-8临时修改> export LC_ALL='zh_CN.utf8'> locale永久
BashPerlTclsyntaxdiff1.进制数表示Languagebinaryoctalhexadecimalbash2#[0~1]0[0~7]0x[0~f]or0X[0~f]perl0b[0~1]0[0~7]0x[0~f]tcl0b[0~1]0o[0~7]0x[0~f]bashdifferentbaserepresntationreference2.StringlengthLanguageStr
正常安装了k8s后,使用kubect工具后接的命令不能直接tab补全命令补全方法:yum-yinstallbash-completionsource/usr/share/bash-completion/bash_completionsource<(kubectlcompletionbash)echo"source<(kubectlcompletionbash)">>~/.bashrc 
参考这里启动jar包shell脚本修改过来的#!/bin/bash#默认应用名称defaultAppName='./gadmin'appName=''if[[$1&&$1!=0]]thenappName=$1elseappName=$defaultAppNamefiecho">>>>>>本次重启的应用:$appName<
#一个数字的行#!/bin/bashwhilereadlinedon=`echo$line|sed's/[^0-9]//g'|wc-L`if[$n-eq1]thenecho$linefidone<1.txt#日志切割归档#!/bin/bashcd/data/logslog=1.logmv_log(){[-f$1]&&mv$1$2
#文件增加内容#!/bin/bashn=0cat1.txt|whilereadlinedon=[$n+1]if[$n-eq5]thenecho$lineecho-e"#Thisisatestfile.\n#Testinsertlineintothisfile."elseecho$linefidone#备份/etc目录#
# su - oraclesu: /usr/bin/ksh: No such file or directory根据报错信息:显示无法找到文件 /usr/bin/ksh果然没有该文件,但是发现存在文件/bin/ksh,于是创建了一个软连接,可以规避问题,可以成功切换到用户下,但无法执行系统自带命令。$. .bash_profile-ksh: .: .b
history显示历史指令记录内容,下达历史纪录中的指令主要的使用方法如果你想禁用history,可以将HISTSIZE设置为0:#exportHISTSIZE=0使用HISTIGNORE忽略历史中的特定命令下面的例子,将忽略pwd、ls、ls-ltr等命令:#exportHISTIGNORE=”pwd:ls:ls-ltr:”使用HIS
一.命令历史  1.history环境变量:    HISTSIZE:输出的命令历史条数,如history的记录数    HISTFILESIZE:~/.bash_history保存的命令历史记录数    HISTFILLE:历史记录的文件路径    HISTCONTROL:     ignorespace:忽略以空格开头的命令
之前在网上看到很多师傅们总结的linux反弹shell的一些方法,为了更熟练的去运用这些技术,于是自己花精力查了很多资料去理解这些命令的含义,将研究的成果记录在这里,所谓的反弹shell,指的是我们在自己的机器上开启监听,然后在被攻击者的机器上发送连接请求去连接我们的机器,将被攻击者的she
BashOne-LinersExplained,PartI:Workingwithfileshttps://catonmat.net/bash-one-liners-explained-part-oneBashOne-LinersExplained,PartII:Workingwithstringshttps://catonmat.net/bash-one-liners-explained-part-twoBashOne-LinersExplained,PartII
Shell中变量的作用域:在当前Shell会话中使用,全局变量。在函数内部使用,局部变量。可以在其他Shell会话中使用,环境变量。局部变量:默认情况下函数内的变量也是全局变量#!/bin/bashfunctionfunc(){a=99}funcecho$a输出>>99为了让全局变量变成局部变量
1、多命令顺序执行;  命令1;命令2  多个命令顺序执行,命令之间没有任何逻辑联系&&  命令1&&命令2  逻辑与,当命令1正确执行,才会执行命令2||  命令1||命令2  逻辑或,当命令1执行不正确,才会执行命令2例如:ls;date;cd/home/lsx;pwd;who ddif=输入文件of=输
原博文使用Linux或者unix系统的同学可能都对#!这个符号并不陌生,但是你真的了解它吗?首先,这个符号(#!)的名称,叫做"Shebang"或者"Sha-bang"。Linux执行文件时发现这个格式,会把!后的内容提取出来拼接在脚本文件或路径之前,当作实际执行的命令。 Shebang这个符号通常在Unix系统的脚本
1、历史命令history[选项][历史命令保存文件]选项:-c:  清空历史命令-w:  把缓存中的历史命令写入历史命令保存文件 ~/.bash_historyvim/etc/profile中的Histsize可改存储历史命令数量历史命令的调用使用上、下箭头调用以前的历史命令使用“!n”重复执行第n条历史
目录1.Shell脚本规范2.Shell脚本执行3.Shell脚本变量3.1环境变量3.1.1自定义环境变量3.1.2显示与取消环境变量3.1.3环境变量初始化与对应文件的生效顺序3.2普通变量3.2.1定义本地变量3.2.2shell调用变量3.2.3grep调用变量3.2.4awk调用变量3.3
   http://www.voidcn.com/blog/wszzdanm/article/p-6145895.html命令功能:显示登录用户的信息命令格式:常用选项:举例:w显示已经登录的用户及正在进行的操作[root@localhost~]#w 11:22:01up4days,21:22, 3users, loadaverage:0.00,0.00,0.00USER