• 欢迎访问显哥博客,本网站纯属学习技术,绝无商业用途,欢迎小伙伴们共同学习!研究技术!QQ:52249909 加我QQ
  • 世界75亿人,这么小的概率,能认识你,是我一生的幸运,不妨加个QQ接触一下:52249909 加我QQ

Shell脚本编程学习——简单脚本案例【显哥出品,必为精品】

Shell编程 lixian 来源:小显博客 5年前 (2020-04-21) 966次浏览 0个评论 扫描二维码
文章目录[隐藏]

一、测试IP地址是否通畅

1.业务需求

使用shell脚本,用户输入主机IP地址,测试主机网络是否通畅

2.脚本代码

#!/bin/bash
##############################################################
# File Name: xian-read.sh
# Time: 2020-04-21-10:25:39
# Author: lixian
# Organization: www.lixian.fun
##############################################################
#提示用户输入一个IP地址进行测试
read -p "主人!请输入需要测试的服务器IP地址:" Ip
#根据用户输入的IP地址进行测试判断
ping -c1 -W1 $Ip &>/dev/null
#根据命令的执行结果进行返回给用户
if [ $? -eq 0 ];then
    echo -e "\033[42;37mIP地址${Ip}是通畅的\033[0m"
else
    echo -e "\033[41;37mIP地址${Ip}是不通的\033[0m"                                             
fi

3.脚本说明


(1)首先read -p 让用户先输入个IP地址,并将IP地址赋个变量
(2)根据用户输入的变量值调用变量,使用ping命令ping用户输入的IP
(3)使用if判断语句,$?是否为0 ,也就是说为0 则上一条命令执行成功,然后输出echo内容
(4)如果$?不为0 则上一条命令执行失败,输出echo内容

4.执行脚本结果

Shell脚本编程学习——简单脚本案例【显哥出品,必为精品】

5.颜色代码

使用规则:echo输出内容 将文字改为你所需要的内容即可

  echo -e "\033[40;37m 黑底白字 \033[0m"
  echo -e "\033[41;37m 红底白字 \033[0m" 
  echo -e "\033[42;37m 绿底白字 \033[0m" 
  echo -e "\033[43;37m 黄底白字 \033[0m" 
  echo -e "\033[44;37m 蓝底白字 \033[0m" 
  echo -e "\033[45;37m 紫底白字 \033[0m" 
  echo -e "\033[46;37m 天蓝底白字 \033[0m" 
  echo -e "\033[47;30m 白底黑字 \033[0m"

二、修改主机名

1.业务需求

使用shell脚本,修改本机的主机名。

2.脚本代码

#!/bin/bash
##############################################################
# File Name: xian-read-sethostname.sh
# Time: 2020-04-21-11:19:15
# Author: lixian
# Organization: www.lixian.fun
##############################################################
read -p "输入需要修改的主机名:" HostName
#提示用户是否真正的修改主机名
read -p "你是否确认要修改的主机名为:${HostName},[y|n]:" Confirm
#根据用户的输入判断是否进行修改主机名
if [ "$Confirm" == "y" ];then
    echo "你选择了要改主机名"
    hostnamectl set-hostname $HostName &>/dev/null
    if [ $? -eq 0 ]; then
        echo "主机名修改成功"
        bash
    else
        echo "主机名修改失败"
        exit
    fi
elif [ "$Confirm" == "n" ];then
    echo "你选择了不修改主机名"
    exit
else
    echo "你输入的不正确!请输入y或者n"
fi

3.脚本说明


(1)首先read -p让用户输入需要修改的主机名,并将输入的内容设为变量HostName
(2)还是用read -p让用户确认是否进行修改,让用户输入y或者n,也就是修改或者不修改,并将y或者n设置变量Confirm
(3)使用if判断语句判断用户输入的变量Confirm是否为y,如果用户输入的值为y,则使用hostnamectl 命令修改主机名,主机名为用户输入的变量hostnamectl 的值
(4)下面再进行判断,判断上一条修改主机名是否成功,如果成功则输出修改成功,如果修改主机名失败,则输出失败,其实就是告诉用户是否修改成功
(5)如果用户输入n,也就是不修改主机名,则echo输出不修改,并退出脚本
(6)如果用户输入不是y也不是n,则告诉用户输入的不正确,请输入y或者n。

4.执行脚本结果

Shell脚本编程学习——简单脚本案例【显哥出品,必为精品】

三、修改主机IP地址

1.业务需求

使用shell脚本,用户根据执行脚本提示,修改本机的IP地址。

2.脚本代码

#!/bin/bash
##############################################################
# File Name: xian-read-eth.sh
# Time: 2020-04-21-11:57:22
# Author: lixian
# Organization: www.lixian.fun
##############################################################
#提示用户输入IP地址最后一位
read -p "请显哥哥输入需要更改IP地址的最后一位:" IP
#提示用户是否需要更改IP地址
read -p "显哥哥确定要修改IP地址吗?[y|n]" Confirm
#开始执行命令修改IP地址
if [ "$Confirm" == y ];then
    echo "显哥哥选择了要修改IP地址,满足你...正在修改中...请稍后..."
    sed -ri "s#(IPADDR.*\.)(.*)#\1$IP#g" /etc/sysconfig/network-scripts/ifcfg-eth[01] &>/dev/null
    if [ $? -eq 0 ];then
        echo -e "\033[42;37mIP地址修改成功...\033[0m"
        read -p "下面需要重启网络服务使IP生效,显哥哥是否需要重启网络服务? [y|n] " Confirm
        if [ "$Confirm" == y ];then
            echo "正在重启网络服务..."
            echo -e "\033[42;37m即将断开连接!请显哥哥使用新的IP地址访问服务器!\033[0m"
            systemctl restart network &>/dev/null
            if [ $? -ne 0 ];then
                echo "网络重启失败!请检查网络服务!"
            fi
        elif [ "$Confirm" == n ];then
            echo -e "\033[41;37m显哥哥选择不重启网络服务,可以手动重启哦~不然IP地址不会生效的呢~\033[0m"
            exit
        else
            echo -e "\033[41;37m显哥哥输入的信息有误,输入y或者n 就可以了呢~\033[0m"
            exit
        fi
    else
        echo "IP地址修改失败~请主人检查脚本哦~"
    fi
elif [ "$Confirm" == n ];then
    echo -e "\033[41;37m显哥哥选择了不修改IP地址!\033[0m"
    exit
else 
    echo -e "\033[41;37m显哥哥输入的信息有误,输入y或者n 就可以了呢~\033[0m"
    exit
fi

3.脚本说明


(1)首先read -p 让用户输入所要修改的IP地址最后一位,并将输入的值设置变量IP
(2)让用户确认是否需要修改IP地址,如果y则确认修改,如果n则不修改,如果不是y也不是n则告诉用户输入的内容有误
(3)用户确认修改了,使用sed命令修改网卡配置文件,将文件内IP地址的最后一位替换用户所输入的变量IP
(4)修改配置文件之后,if判断是否修改成功,如果成功则需要重启网络服务使IP生效,如果失败则返回失败信息
(5)重启网卡服务需要用户输入y或者n,如果输入y则重启,输入n则不重启
(6)如果选择了重启,则需要判断是否重启成功并返回给用户结果

4.执行脚本结果

Shell脚本编程学习——简单脚本案例【显哥出品,必为精品】

四、查看当前系统内存的使用状态

1.业务需求

使用shell脚本,查看当前系统内存的使用状态,如果内存大于80%,将报警信息发邮件给用户

2.脚本代码

#!/bin/bash
##############################################################
# File Name: xian-mail-free.sh
# Time: 2020-04-21-15:36:00
# Author: lixian
# Organization: www.lixian.fun
##############################################################
#将使用率的大小定义为一个变量
Mem_Used=`free -m |awk '/Mem/{print $3/$2*100}'`
#根据变量的值来判断
if [ ${Mem_Used%.*} -gt 80 ];then
    echo -e "\033[41;37m当前内存使用率过高!使用率为:${Mem_Used}%\033[0m"
    echo "当前内存使用率过高!使用率为:${Mem_Used}%" |mail -s "内存使用率过高!" lixian656@qq.com   &>/dev/null
    if [ $? -eq 0 ];then
        echo "主人,我已经发邮件通知你啦!"
    else
        echo "哎呀,发送邮件失败啦!"
    fi
else
    echo -e "\033[42;37m当前内存使用率正常!使用率为:${Mem_Used}%\033[0m"
fi

mail.rc邮件配置

[root@xian /server/scripts]# vim /etc/mail.rc
set from=lixian656@qq.com
set smtp=smtp.qq.com
set smtp-auth-user=lixian656@qq.com
set smtp-auth-password=#授权码
set smtp-auth=login
set smtp=smtps://smtp.qq.com:465          
set ssl-verify=ignore
set nss-config-dir=/etc/pki/nssdb/

内存压力测试

dd if=/dev/zero of=/root/ll.log bs=750M count=10
10+0 records in
10+0 records out
7864320000 bytes (7.9 GB) copied, 76.913 s, 102 MB/s

3.脚本说明


(1)首先使用awk命令取出当前系统的内存值,并将值设置为变量Mem_Used
(2)其次判断变量值是否大于80,如果大于80则输出使用率,并将大于80使用率发送给用户邮箱,判断是否发送成功
(3)如果内存使用率小于80则直接输出使用率

4.执行脚本结果

Shell脚本编程学习——简单脚本案例【显哥出品,必为精品】

五、备份文件或目录

1.业务需求

使用shell脚本,对文件目录进行备份,备份文件要以时间和IP地址及目录名命名

2.脚本代码

#!/bin/bash
##############################################################
# File Name: xian-backup.sh
# Time: 2020-04-21-16:18:43
# Author: lixian
# Organization: www.lixian.fun
##############################################################
#定义变量
Back_Dir=/backup
Ip=$(ifconfig eth0 |awk 'NR==2{print $2}')
Date=$(date +%F)
#提示用户输入要备份的数据目录
read -p "请输入你要备份的目录:" Data_Dir
#判断备份的目录是否存在,存在则不进行创建,不存在则创建
[ -d $Back_Dir ] || mkdir -p $Back_Dir
#判断数据目录是否存在
if ls -d $Data_Dir &>/dev/null;then                                                
    cd / && tar czf $Back_Dir/${Date}_${Ip}_${Data_Dir#/}.tar.gz ${Data_Dir#/} &>/dev/null && cd - &>/dev/null
        if [ $? -eq 0 ];then
            echo -e "\033[42;37m数据目录${Back_Dir}备份成功!\033[0m"
        else
            echo -e "\033[41;37m数据目录${Back_Dir}备份失败!\033[0m"
        fi
    else
        echo -e "\033[41;37m你要备份的数据目录${Data_Dir}不存在\033[0m"
fi

3.脚本说明


(1)备份目录首先定义变量,因为需备份文件需要以时间、IP地址和目录名命名,而且它们是变化的,所以要把时间、IP地址和目录名设置变量
(2)用户首先输入需要备份的数据目录,接下来判断目标备份目录是否存在,如果存在就执行tar命令进行备份,否则输出目录不存在
(3)备份的过程调用之前的变量,以时间、IP地址和目录名命名
(4)判断tar备份是否成功,如果成功则输出结果,反正备份失败

4.执行脚本结果

Shell脚本编程学习——简单脚本案例【显哥出品,必为精品】

六、脚本修改IP地址和主机名

#!/bin/bash
##############################################################
# File Name: ip-hostname.sh
# Time: 2020-04-21-22:10:46
# Author: lixian
# Organization: www.lixian.fun
##############################################################
#提示用户需要修改主机名和IP地址
read -p "输入需要修改的主机名:" HostName
read -p "输入需要修改的IP地址的最后一位:" IP
#提示用户确认需要修改吗
read -p "您确定要修改主机名和IP地址吗?[y|n]" Confirm
if [ "$Confirm" == y ];then
#修改主机名和IP地址
    echo "您确定了修改...请稍后..."
    hostnamectl set-hostname $HostName &>/dev/null
    if [ $? -eq 0 ]; then
        echo -e "\033[42;37m主机名修改成功...\033[0m"
    else
        echo -e "\033[41;37m主机名修改失败...\033[0m"
    fi
    sed -ri "s#(IPADDR.*\.)(.*)#\1$IP#g" /etc/sysconfig/network-scripts/ifcfg-eth[01] &>/dev/null
        if [ $? -eq 0 ];then
            echo -e "\033[42;37mIP地址修改成功...\033[0m"
        read -p "下面需要重启网络服务使IP生效,显哥哥是否需要重启网络服务? [y|n] " Confirm
        if [ "$Confirm" == y ];then
            echo "正在重启网络服务..."
            echo -e "\033[42;37m即将断开连接!请显哥哥使用新的IP地址访问服务器!\033[0m"
            systemctl restart network &>/dev/null
            if [ $? -ne 0 ];then
                echo -e "\033[41;37m网络重启失败!请检查网络服务!\033[0m"
            fi
        elif [ "$Confirm" == n ];then
            echo -e "\033[41;37m显哥哥选择不重启网络服务,可以手动重启哦~不然IP地址不会生效的呢~\033[0m"
            exit
        else
            echo -e "\033[41;37m显哥哥输入的信息有误,输入y或者n 就可以了呢~\033[0m"
            exit
        fi
        fi
fi

七、Shell的变量替换

1.Shell的变量替换

${#变量}			#获取变量值的长度

${变量#匹配规则}	 #从头开始匹配,最短删除

${变量##匹配规则}	 #从头开始匹配,最长删除

${变量%匹配规则}	 #从尾开始匹配,最短删除

${变量%%匹配规则}	 #从尾开始匹配,最长删除

${变量/旧的字符串/新的字符串}  #替换变量中旧的字符串为新的字符串,只替换第一个匹配到

${变量//旧的字符串/新的字符串}	#替换变量中旧的字符串为新的字符串,全部替换

${变量:匹配规则:匹配规则}		 #索引及切片

2.案例

[root@xian /server/scripts]# url=www.lixian.fun
[root@xian /server/scripts]# echo ${url}
www.lixian.fun
[root@xian /server/scripts]# echo ${#url}  #获取长度
14
[root@xian /server/scripts]# echo www.lixian.fun |wc -L  #wc命令获取长度
14
[root@xian /server/scripts]# echo ${url#*.}    #从前往后,最短匹配到的删除
lixian.fun
[root@xian /server/scripts]# echo ${url##*.}   #从前往后,最长匹配到的删除
fun
[root@xian /server/scripts]# echo ${url%.*}   #从后往前匹配,最短删除
www.lixian
[root@xian /server/scripts]# echo ${url%%.*}   #从后往前匹配,最长删除
www
[root@xian /server/scripts]# echo ${url/w/W}   #把w替换成W,只替换第一个匹配到的
Www.lixian.fun
[root@xian /server/scripts]# echo ${url//w/W}   #把w替换成W,替换所有的
WWW.lixian.fun
[root@xian /server/scripts]# echo ${url:4:6}    #从4列开始匹配,切出6列
lixian
[root@xian /server/scripts]# echo ${url:4} #删除前4列
lixian.fun

八、小案例

1.案例

在/backup下创建10个.txt的文件,提前创建好,找到/backup目录下所有后缀名为.txt的文件
1)批量修改txt为txt.bak
2)把所有的.bak文件打包压缩为123.tar.gz
3)批量还原文件的名字,及把增加的.bak再删除

2.shell脚本

#!/bin/bash
##############################################################
# File Name: bakup.sh
# Time: 2020-04-21-23:34:02
# Author: lixian
# Organization: www.lixian.fun
##############################################################

cd /backup

find ./ -type f -name '*.txt' |xargs -I {} rename "txt" "txt.bak" {}; &>/dev/null
if [ $? -eq 0 ];then
    echo -e "\033[42;37m批量修改txt为txt.bak成功...\033[0m"
else
    echo -e "\033[41;37m批量修改txt为txt.bak失败...\033[0m"
fi
tar czf 123.tar.gz  `find ./ -type f -name '*.txt.bak'` &>/dev/null                
if [ $? -eq 0 ];then
    echo -e "\033[42;37m文件打包压缩为123.tar.gz成功...\033[0m"
else
    echo -e "\033[41;37m文件打包压缩为123.tar.gz失败...\033[0m"
fi
find ./ -type f -name '*.txt.bak' |xargs -I {} rename "txt.bak" "txt" {}; &>/dev/null
if [ $? -eq 0 ];then
    echo -e "\033[42;37m批量还原文件的名字成功...\033[0m"
else
    echo -e "\033[41;37m批量还原文件的名字失败...\033[0m"
fi

3.执行结果

Shell脚本编程学习——简单脚本案例【显哥出品,必为精品】


本站博主 , 版权所有丨如未注明 , 均为原创
转载请注明原文链接:Shell脚本编程学习——简单脚本案例【显哥出品,必为精品】
喜欢 (0)

您必须 登录 才能发表评论!