shell脚本-终于会跑了

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

在这里插入图片描述

  • 11
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

神慕蔡蔡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值