1.每天几个脚本开心你我她
1.打印0-100的偶数
#seq方式
[root@8-4 ~]# seq 0 2 100
0
2
4
6
8
10
12
......
#脚本方式
[root@8-4 ~]# cat test.sh
#!/bin/bash
for i in $(seq 0 2 100);do
echo $i
done
2.打印1-50数字,但是20-40之间不打印
#while循环方法
[root@8-4 ~]# cat test.sh
#!/bin/bash
i=0
while [ $i -lt 50 ];do
let i++
if [ $i -ge 20 ] && [ $i -le 40 ];then
continue
fi
echo $i
done
[root@8-4 ~]# source test.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
41
42
43
44
45
46
47
48
49
50
#for循环方法
[root@8-4 ~]# cat test.sh
#!/bin/bash
for i in $(seq 1 50);do #范围1-50
if [ $i -ge 20 -a $i -le 40 ];then #-a:&&条件
continue #跳过条件的内容
fi
echo $i #打印变量输出的值
done
[root@8-4 ~]# source test.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
41
42
43
44
45
46
47
48
49
50
3.打印passwd文件中的每行用户名字用===分隔
#for循环方式
[root@8-4 ~]# cat test.sh
#!/bin/bash
for user in $(cat /etc/passwd);do
echo $user |awk -F: '{print $1}'
echo =====================
done
[root@8-4 ~]# source test.sh |head -10
root
=====================
bin
=====================
daemon
=====================
adm
=====================
lp
=====================
#while循环方式
[root@8-4 ~]# cat test.sh
#!/bin/bash
while read user;do
echo $user |awk -F: '{print $1}' /etc/passwd
echo =========================
done < /etc/passwd
4.猜一个随机数,数值在0-100
#if判断方式
[root@8-4 ~]# cat test.sh
#!/bin/bash
num=$[$RANDOM%100]
read -p "猜数值:" number
if [ $num -ne $number ];then
echo "fali"
elif [ $num -eq $number ];then
echo "success"
fi
[root@8-4 ~]# source test.sh
猜数值:50
fali #猜的50数字是错误的显示fail
[root@8-4 ~]# echo $num
52 #查看随机的正确数字是52
2.正则表达式
正则表达式:REGEXP,REGular EXPression
1.正则表达式的分类:
- 基本正则表达式(Basic REGEXP)
- 扩展正则表达式(Extended REGEXP)
2.基本正则表达式
过滤的内容用引号叫正则表达式,否则叫通配符
#匹配符
. //匹配任意单个字符 .. //匹配任意俩个字符
[] //匹配范围内的字符
[^] //匹配指定范围外的字符
[a-z][a-z] //匹配俩个a-z交叉的双字符
#匹配次数
* //匹配其前面的单个任意字符次数
.* //任意长度的任意字符
\? //匹配其前面的任意单个字符1次或0次
\+ //匹配其前面的任意字符至少1次,至多n次
\{m,n\} //匹配其前面的任意字符至少n次,至多m次
#位置匹配
^ //锁定开头,此字符后面的任意单个字符必须是行首
$ //锁定结尾,此字符后面的任意单个字符必须是行尾
^$ //空白行 //可以搭配-v 反匹配使用
\b或\< //锁定某首,后面的任意单字符必须在行首
\b或\> //锁定某尾,后面的任意单字符必须在行尾
#分组
\2
\1
基于以上内容练习一下
#1-100数字中匹配24和44(组合匹配)
[root@clq ]# ls |grep '[24][4]'
24
44
#1-100数字中匹配2和4(单个匹配)
[root@clq ]# ls |grep '^[2][4]$'
2 4
#过滤没有空行内容以及没有#注释的内容
^$:空白行
-v:匹配到匹配的内容之外的内容叫反匹配
| :使^$和^#组合在一起使用
\:转义
[root@contos ~]# grep -v '^$\|^#' anaconda-ks.cfg
graphical
repo --name="AppStream" --baseurl=file:///run/install/sources/mount-0000-cdrom/AppStream
%packages
@^graphical-server-environment
@development
@legacy-unix
%end
keyboard --xlayouts='cn'
lang zh_CN.UTF-8
network --bootproto=dhcp --device=ens33 --ipv6=auto --activate
network --hostname=localhost.localdomain
cdrom
firstboot --enable
ignoredisk --only-use=sda
autopart
clearpart --none --initlabel
timezone Asia/Shanghai --isUtc
rootpw --iscrypted $6$BdiszoG3oWLArBYm$4Lveg0s1h1sY7MlTc42sAeS7oJ7d5mFpFKuhFI//o47Eey5f5dA0tzO1kwXm090iKa.zx5yBlx0Av3KjzoETF0
%addon com_redhat_kdump --disable --reserve-mb='auto'
%end
%anaconda
pwpolicy root --minlen=6 --minquality=1 --notstrict --nochanges --notempty
pwpolicy user --minlen=6 --minquality=1 --notstrict --nochanges --emptyok
pwpolicy luks --minlen=6 --minquality=1 --notstrict --nochanges --notempty
%end
#\b的使用
[root@contos ~]# cat haha
tom
tomm
oppo
hello world
ppo123 tomom
tome hehe
tom
[root@contos ~]# grep '^tom\b' haha
tom
tom
\#分组使用,把ab当成一个整[root@contos ~]# ls
abc abcdd abcd
[root@contos ~]# ls |grep '^\(ab\)cd*$'
abc
abcd
abcdd
#调换顺序的使用,要求:dcba调换顺序为abcd
注意:
1. (.*)必须转义才能使用,除非扩展正则表达式不需要
2. (.*)(.*) (.*) (.*) 分别对应 d c b a
3. \4 \3 \2 \1 分别对应 a b c d
[root@contos ~]# cat xixi
d c b a
[root@contos ~]# sed -i 's/\(.*\) \(.*\) \(.*\) \(.*\) / \4 \3 \2 \1 /' xixi
a b c d
3.扩展正则表达式
转义:代表自己本身,没有特殊意义
而扩展正则大部分是不需要转义的
使用sed时,带参数 -E, -r, --regexp-extended
使用grep时,参数:-E
#匹配符
. //匹配任意单个字符 .. //匹配任意俩个字符
[] //匹配范围内的字符
[^] //匹配指定范围外的字符
[a-z][a-z] //匹配俩个a-z交叉的双字符
#匹配次数
* //匹配其前面的单个任意字符次数
.* //任意长度的任意字符
? //匹配其前面的任意单个字符1次或0次
+ //匹配其前面的任意字符至少1次,至多n次
{m,n} //匹配其前面的任意字符至少n次,至多m次
-E参数的使用
[root@contos ~]# grep -Ev '^$|^#' anaconda-ks.cfg
graphical
repo --name="AppStream" --baseurl=file:///run/install/sources/mount-0000-cdrom/AppStream
[root@contos ~]# grep -Ev '^$|^#' anaconda-ks.cfg
graphical
repo --name="AppStream" --baseurl=file:///run/install/sources/mount-0000-cdrom/AppStream
%packages
@^graphical-server-environment
@development
@legacy-unix
%end
keyboard --xlayouts='cn
4.函数的应用
邮件代理
MUA(邮件用户代理)
MTA(邮件传送代理)
MDA(邮件分发代理)
mailx
mail和mailx都是负责查看编写邮件和向MTA发送邮件的MUA,mailx是加强版
postfix
postfix:邮件传送代理软件
特点:免费,快,兼容性好,灵活性,安全性
安装邮件服务
dnf -y install mailx postfix
systemctl start postfix.service
ss -antl
State Recv-Q Send-Q Local Address:Port Peer
LISTEN 0 32 192.168.122.1:53
#如果邮件发不到qq邮箱,是因为解析服务器没设置
[root@8-4 ~]# cat /etc/resolv.conf
# Generated by NetworkManager
search localdomain
nameserver 192.168.136.2
nameserver 8.8.8.8
nameserver 8.8.4.4
函数案例脚本
[root@8-4 ~]# cat test.sh
#!/bin/bash
function sendmail() { #邮件发送函数{}
echo "$1" | mail -s "$2" $3 #$1:手动输入的一个值 $2:分别对应下面三个内容输出 $3:邮箱地址
}
if [ $1 == 'memory' ];then
sendmail "内存不够用了" "内存预警" xx@qq.com
elif [ $1 == 'cpu' ];then
sendmail "cpu过高了" "cpu预警" xx@qq.com
elif [ $1 == 'disk' ];then
sendmail "disk空间不足" "磁盘预警" xx@qq.com
else
sendmail "所有主机运行正常" "一切ok" xx@qq.com
fi
[root@8-4 ~]# chmod +x test.sh
[root@8-4 ~]# source test.sh cpu