Shell编程基础之函数和正则表达式-基本元字符与拓展元字符

函数

函数基本概念:
本质来说就是实现某个功能的代码片段,只不过这段功能我们把它叫做了函数.

函数声明方式有两种方法:
方法1:
在定义函数名字前面增加function关键字.
方法2:
直接写函数的名字,加{}花括号在里面写函数体.
如:hanshu( ){ abcd } hanshu
代表hanshu是函数名,括号等于是接收的内容( ),花括号包含的是函数体,函数体内的得出的值赋给前面的括号,那么hanshu这个函数的值就是( )括号里的内容,最后写函数名调用函数.
推荐使用方法2,写起来轻松.

例1:
[root@localhost 20200416]# vim 01.function.sh
过程是:
在这里插入图片描述
在我们文件中我们是先声明一个函数,然后再写花括号里的函数体,最后再调用声明的函数。
在这里插入图片描述
但程序在执行的过程中是先执行的调用,再去执行函数体的内容.
所以函数只要不被调用,就不会被执行.写函数名就是被调用,才会去触发这个操作.

函数作用域的问题:

作用域的概念会涉及到一个局部变量和全局变量的区别.

例2:
[root@localhost 20200416]# vim 02.function_variable.sh
在这里插入图片描述
上面的思考点在于,函数体外面有一个globle_variable,函数体内也有一个globle_variable,那如果我们先去执行println那么肯定会打印hello kitty.但如果我们执行完println再去执行echo ${globle_variable}我们是拿到哪个结果呢?
在这里插入图片描述
上面得出的结果最后还是打印出的hello kitty

因为这个hello kitty相当于在我们函数体里面改变了,在shell里边我们就可以得出一个结论,在函数体里面,我们可以去修改全局变量,在函数体内部中的变量,在函数体的外部也可以去引用.

就等于如果我们把第一行的全局变量注释掉.得出的结果也是一样的.这个变量在函数体的内部,同样可以被外部的命令去调用.
在这里插入图片描述
在这里插入图片描述
先是第一个全局变量先声明,然后我们在函数体内再对全局变量进行了重新声明重新赋值,接着第一个全局声明的变量值它就被改变了.那么它被改变之后,那么函数体内的变量值就变成了一个全局变量.

local:禁锢
上面的内容理解之后我们可以去想想,如果我希望在函数体内部的变量值不去修改函数体外部的变量值,也不想让函数体外部的命令去调用到函数体内部的变量.
那我们应该把函数体内部的变量禁锢在函数体中.
local
在这里插入图片描述
在这里插入图片描述
这里就是函数作用域的问题,写函数的时候在函数定义某个变量的过程切记要加 local 这样可以增大明明区间.这样就不会和外面的变量造成冲突.

函数小实例:

把公钥远程传送出去其它主机
[root@localhost 20200416]# vim 03.function_sshkey.sh
主要先把两个函数体写好,生成密钥和传送密钥.

在一般情况下都是用ssh-keygen生成公钥.然后一直回车.
但到我们脚本函数里面我们没办法交互按回车.
在这里插入图片描述
有一个叫做自动应答函数可以实现,但生成公钥这里是不推荐使用的.下面传送公钥的时候才会使用.

例1:生成公钥
[root@localhost 20200416]# rm -rf ~/.ssh/*
先把刚才生成的公钥删了.

ssh-keygen -b 2048 -t rsa -N "" -f $HOME/.ssh/id_rsa

推荐使用这种方法自定义生成我们的密钥对而不需要去按回车.这样我们就可以写在脚本里面.
指定这个公钥加密算法的大小2048位,类型rsa,不对私钥加密,生成在当前用户的HOME目录里面的.ssh里面,名字为id_rsa

在这里插入图片描述
2:传送密钥
[root@localhost 20200416]# ssh-copy-id root@192.168.0.167
在这里插入图片描述
如果我们传送给其它机器的话需要我们手动交互,需要输入yes.并且还需要一个密码.之后才可以进行免密登陆.

如果我们想在脚本里进行这种操作,我们可以去使用自动应答函数.
它在写的过程中需要我们在shell里面引用另外一种语言写的一个代码工具.
在这里插入图片描述
EOF和EOF夹着自动应答函数语句然后给expect解释器去执行.
spawn sssh-copy-id root@1.1.1.1
#这个语句是定位哪个地方产生的交互,要我们键盘输入内容的地方.

[root@localhost 20200416]# bash 03.function_sshkey.sh
最后再执行即可.

这上面的就是自动应答函数.它是TCL语言写的自动应答函数叫expect,经常被我用作一些面交互式的操作.因为脚本执行需要效率,所以会需要它.

接着我们来封装一下这段内容,让它变为一个函数.
在这里插入图片描述
如果在文件中其它地方需要用到这段代码,那么我们可以直接调用填写这个代码名称就可以.可以用for循环去写,认证多个主机.

正则表达式:

在运维的过程中我们经常能用到,可以利用这些元字符进行字符数据的一些匹配.方便我们在文件中查找一些特殊字符以及查找一些特定字符.
这些其实我们都可以统称叫做模糊查找.

grep password /var/log/mysql.log #精确查找
grep pass* /var/log/mysql.log #模糊查找

在这里插入图片描述

[root@localhost 20200416]# vim 04.test.txt
在这里插入图片描述
[root@localhost 20200416]# grep ^shell 04.test.txt
^:行首定位符
#过滤匹配以shell开头的内容.

[root@localhost 20200416]# grep shell$ 04.test.txt
$:行尾定位符
#过滤匹配以shell结尾的内容.

[root@localhost 20200416]# grep sh*ell 04.test.txt
:匹配前导符0次到多次 前导符=前面的字符
#过滤匹配
前面字符的0次到多次,图里面表示sh
ell的sh到e之间无论有几个字符都给你筛出来.
在这里插入图片描述

[root@localhost 20200416]# grep s.ell 04.test.txt
.:匹配单个字符
#过滤匹配s.ell中的点,只匹配1个.多了没有.

[root@localhost 20200416]# grep .* 04.test.txt
.*:任意多个字符
#过滤匹配任意字符,图上面没前缀后缀,就是整个文本了.
在这里插入图片描述
[root@localhost 20200416]# grep [Sshe] 04.test.txt
[ ]:匹配指定字符中的⼀个字符
#过滤匹配符合括号里面任意一个字符.只要它有就能找到.
在这里插入图片描述
[root@localhost 20200416]# grep [a-z] 04.test.txt
[ - ] :匹配指定范围内的⼀个字符
#过滤匹配一个范围的字符,[a-z],或者[1-10]意思一样
在这里插入图片描述
[root@localhost 20200416]# grep [^0-9] 04.test.txt
[^ ]: 匹配不在指定组内的⼀个字符
#过滤匹配不在这个范围内的字符,[^8]除了8以外,反选的意思.
乌龟把头[^]缩进里面,变为无[非]头乌龟
乌龟把头[^]伸出来,变为[首]领
在这里插入图片描述
\:转义
把原来的意思反转,图中定义了一个变量hgf=“shell”,然后在04文本里过滤匹配这个变量,实际等于过滤匹配shell.不加转义就能正常匹配到内容,加上转义之后等于改变了原本这个变量的意思.让这个${hgf}变量回到了字符意思.文本里没这几个字符,所以搜不到
在这里插入图片描述

\(…\) :匹配后⾯使⽤的字符标签
VIM里 :% s/(1.)(1.)(1.)(100)/\1\2\3999/g
比如我想把图中1.1.1.100的100换成999,首先我们需要把这个IP段分成4个标签,:% s/(1.)(1.)(1.)(100)//g
由于这个( )是拓展元字符里的匹配括号中的词组,所以在这个场景里面我们要对这个括号进行转义.否则在这个例子的意思就变了.
:% s/(1.)(1.)(1.)(100)//g 这样就相当于4个括号4个标签.
然后要让前面3个标签保持不变,那么就用转义+1=第一个标签,代表的就是1.,后面以此类推.直到你要改变的第4个标签直接写成你要替换成的字符即可.
:% s/(1.)(1.)(1.)(100)/\1\2\3999/g在这里插入图片描述
在这里插入图片描述

No.2 正则表达式拓展元字符
在这里插入图片描述
拓展元字符要用 egrep 是 grep的升级版.

[root@localhost 20200416]# egrep sh+ell 04.test.txt
+: 匹配1个或多个前导字符
#过滤匹配sh 和 ell之间起码出现1个字符.和基本元字符*差别在于起始次数不一样.
在这里插入图片描述

[root@localhost 20200416]# egrep sh?ell 04.test.txt
? :匹配0个或 1 个前导字符
#过滤匹配sh和ell之间的0个或者1个字符,只是0或1,多了没有.
+号和?号组合在一起理论上就是我们的*号
在这里插入图片描述

[root@localhost 20200416]# egrep “shell|python” 04.test.txt
var01|var02 :匹配var01或者var02
#过滤匹配shell或者python,符合其中之一或者同时都有.
在这里插入图片描述

[root@localhost 20200416]# egrep “(shell|python)” 04.test.txt
( ): 匹配括号中的词组
#匹配括号内的字符,括号起来作为一个整体,这里的用法和上面那里没啥大区别,后面匹配电话号码和IP的时候能看出来明显些的区别.
在这里插入图片描述
[root@localhost 20200416]# egrep “she{2}ll” 04.test.txt
x{m} :规定字符x重复出现m次.只能.
在这里插入图片描述

[root@localhost 20200416]# egrep “she{2,}ll” 04.test.txt
x{m,} :规定字符x重复出现⾄少m次.至少.
在这里插入图片描述

[root@localhost 20200416]# egrep “she{2,3}ll” 04.test.txt
x{m,n} 规定字符x重复出现m到n次.出现2到3次.
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值