shell脚本实例精讲_shell脚本编程实例

2022-11-10 20:24:22 浏览数 (1)

大家好,又见面了,我是你们的朋友全栈君。

shell 是一个应用程序,它连接了用户和 Linux 内核,让用户能够更加高效、安全、低成本地使用 Linux 内核,这就是 Shell 的本质。

shell脚本就是由Shell命令组成的执行文件,将一些命令整合到一个文件中,进行处理业务逻辑,脚本不用编译即可运行。它通过解释器解释运行,所以速度相对来说比较慢。

shell脚本中最重要的就是对shell命令的使用与组合,再使用shell脚本支持的一些语言特性,完成想要的功能。

今天给大家分享《shell脚本100例》,包含了90%的shell脚本知识点,想要学习、提升、面试的同学一定要学习下,篇幅有限,写不完全部的内容,已经把文章整理成pdf,方便大家查阅和学习。【需要的看文末】

配合视频学习效果更佳!shell视频教程

  1. 编写 helloworld 脚本
代码语言:javascript复制
#!/bin/bash
echo "hello world"
  1. 通过位置变量创建 Linux 系统账户及密码
代码语言:javascript复制
#!/bin/bash
#$1 是执行脚本的第一个参数,$2 是执行脚本的第二个参数
useradd    "$1"
echo "$2"  |  passwd  ‐‐stdin  "$2"
  1. 每周 5 使用 tar 命令备份/var/log 下的所有日志文件
代码语言:javascript复制
#vim  /root/logbak.sh
#编写备份脚本,备份后的文件名包含日期标签,防止后面的备份将前面的备份数据覆盖
#注意 date 命令需要使用反引号括起来,反引号在键盘<tab>键上面
tar    -czf    log-`date  %Y%m%d`.tar.gz    /var/log
# crontab ‐e                             #编写计划任务,执行备份脚本
00    03    *    *    5      /root/logbak.sh
  1. 一键部署 LNMP(RPM 包版本)
代码语言:javascript复制
#!/bin/bash
#使用 yum 安装部署 LNMP,需要提前配置好 yum 源,否则该脚本会失败
#本脚本使用于 centos7.2 或 RHEL7.2
yum ‐y install httpd
yum ‐y install mariadb mariadb‐devel mariadb‐server
yum ‐y install php  php‐mysql
systemctl start httpd mariadb
systemctl enable httpd mariadb
  1. 实时监控本机内存和硬盘剩余空间,剩余内存小于 500M、根分区剩余空间小于 1000M

时,发送报警邮件给 root 管理员

代码语言:javascript复制
#!/bin/bash
#提取根分区剩余空间
disk_size=$(df / |awk '///{print $4}')
#提取内存剩余空间
mem_size=$(free |awk '/Mem/{print $4}')
while :
do
#注意内存和磁盘提取的空间大小都是以 Kb 为单位
if  [  $disk_size  ‐le  512000  ‐a  $mem_size  ‐le  1024000  ];then
     mail  ‐s  Warning  root  <<EOF
Insufficient resources,资源不足
EOF
fi
done
  1. 脚本生成一个 100 以内的随机数,提示用户猜数字,根据用户的输入,提示用户猜对了,

猜小了或猜大了,直至用户猜对脚本结束。

代码语言:javascript复制
#!/bin/bash
#RANDOM 为系统自带的系统变量,值为 0‐32767 的随机数
#使用取余算法将随机数变为 1‐100 的随机数
num=$[RANDOM0 1]
#使用 read 提示用户猜数字
#使用 if 判断用户猜数字的大小关系:‐eq(等于),‐ne(不等于),‐gt(大于),‐ge(大于等于),‐lt(小于),‐le(小
于等于)
while  :
do
      read ‐p  "计算机生成了一个 1‐100 的随机数,你猜: "  cai
      if   [  $cai  ‐eq   $num  ];then
             echo   "恭喜,猜对了"
             exit
      elif  [  $cai   ‐gt   $num  ];then
             echo   "Oops,猜大了"
      else
             echo   "Oops,猜小了"
      fi
  1. 检测本机当前用户是否为超级管理员,如果是管理员,则使用 yum 安装 vsftpd,如果不

是,则提示您非管理员(使用字串对比版本)

代码语言:javascript复制
#!/bin/bash
if  [  $USER  ==  "root"  ];then
         yum  ‐y  install   vsftpd
else
        echo "您不是管理员,没有权限安装软件"
fi
  1. 检测本机当前用户是否为超级管理员,如果是管理员,则使用 yum 安装 vsftpd,如果不

是,则提示您非管理员(使用 UID 数字对比版本)

代码语言:javascript复制
#!/bin/bash
if  [  $UID  ‐eq  0  ];then
         yum  ‐y  install   vsftpd
else
        echo "您不是管理员,没有权限安装软件"
fi
  1. 编写脚本:提示用户输入用户名和密码,脚本自动创建相应的账户及配置密码。如果用户

不输入账户名,则提示必须输入账户名并退出脚本;如果用户不输入密码,则统一使用默

认的 123456 作为默认密码。

代码语言:javascript复制
#!/bin/bash
read  ‐p  "请输入用户名: "   user
#使用‐z 可以判断一个变量是否为空,如果为空,提示用户必须输入账户名,并退出脚本,退出码为 2 #没有输入用户名脚本退出后,使用$?查看的返回码为 2
if  [   ‐z  $user  ];then
      echo "您不需输入账户名"
      exit 2
fi
#使用 stty ‐echo 关闭 shell 的回显功能
#使用 stty  echo 打开 shell 的回显功能
stty  ‐echo
read  ‐p  "请输入密码: "     pass
stty  echo
pass=${pass:‐123456}
useradd   "$user"
echo  "$pass"  |  passwd  ‐‐stdin   "$user"
  1. 依次提示用户输入 3 个整数,脚本根据数字大小依次排序输出 3 个数字
代码语言:javascript复制
#!/bin/bash
read ‐p "请输入一个整数:" num1
read ‐p "请输入一个整数:" num2
read ‐p "请输入一个整数:" num3
#不管谁大谁小,最后都打印 echo "$num1,$num2,$num3"
#num1 中永远存最小的值,num2 中永远存中间值,num3 永远存最大值
#如果输入的不是这样的顺序,则改变数的存储顺序,如:可以将 num1 和 num2 的值对调
tmp=0
#如果 num1 大于 num2,就把 num1 和和 num2 的值对调,确保 num1 变量中存的是最小值
if [ $num1 ‐gt $num2 ];then      
tmp=$num1
num1=$num2
num2=$tmp
fi
#如果 num1 大于 num3,就把 num1 和 num3 对调,确保 num1 变量中存的是最小值
if [ $num1 ‐gt $num3 ];then      
tmp=$num1
num1=$num3
num3=$tmp
fi
#如果 num2 大于 num3,就把 num2 和 num3 对标,确保 num2 变量中存的是小一点的值
if [ $num2 ‐gt $num3 ];then   
tmp=$num2
num2=$num3
num3=$tmp
fi
echo "排序后数据为:$num1,$num2,$num3"
  1. 编写脚本,实现人机<石头,剪刀,布>游戏
代码语言:javascript复制
#!/bin/bash
game=(石头 剪刀 布)
num=$[RANDOM%3]
computer=${game[$num]}
#通过随机数获取计算机的出拳
#出拳的可能性保存在一个数组中,game[0],game[1],game[2]分别是 3 中不同的可能
echo "请根据下列提示选择您的出拳手势"
echo "1.石头"
echo "2.剪刀"
echo "3.布"
read  ‐p  "请选择 1‐3:"  person
case  $person  in
1)
if [ $num ‐eq 0 ];then
   echo "平局"
elif [ $num ‐eq 1 ];then
   echo "你赢"
else
   echo "计算机赢"
fi;;
2)   
if [ $num ‐eq 0 ];then
   echo "计算机赢"
elif [ $num ‐eq 1 ];then
   echo "平局"
else
   echo "你赢"
fi;;
3)
if [ $num ‐eq 0 ];then
   echo "你赢"
elif [ $num ‐eq 1 ];then
   echo "计算机赢"
else
   echo "平局"
fi;;
*)
echo "必须输入 1‐3 的数字"
esac
  1. 编写脚本测试 192.168.4.0/24 整个网段中哪些主机处于开机状态,哪些主机处于关机

状态(for 版本)

代码语言:javascript复制
#!/bin/bash
for  i  in   {1..254}
do
          ping ‐c2 ‐i0.3 ‐W1 192.168.4.$i  &>/dev/null
         if  [ $? –eq 0 ];then
               echo "192.168.4.$i is up"
         else
               echo  "192.168.4.$i is down"
         fi
done
  1. 编写脚本测试 192.168.4.0/24 整个网段中哪些主机处于开机状态,哪些主机处于关机

状态(while 版本)

代码语言:javascript复制
#!/bin/bash
i=1
while  [  $i  ‐le  254 ]
do
          ping ‐c2 ‐i0.3 ‐W1 192.168.4.$i  &>/dev/null
         if  [ $? –eq 0 ];then
               echo "192.168.4.$i is up"
         else
               echo  "192.168.4.$i is down"
         fi
         let i  
done
  1. 编写脚本测试 192.168.4.0/24 整个网段中哪些主机处于开机状态,哪些主机处于关机

状态(多进程版)

代码语言:javascript复制
#!/bin/bash
#定义一个函数,ping 某一台主机,并检测主机的存活状态
myping(){
ping ‐c2 ‐i0.3 ‐W1 $1  &>/dev/null
if  [ $? ‐eq 0 ];then
     echo "$1 is up" 
     else
     echo    "$1 is down" 
     fi
}
for  i  in   {1..254}
do
         myping 192.168.4.$i &
done
#使用&符号,将执行的函数放入后台执行
#这样做的好处是不需要等待 ping 第一台主机的回应,就可以继续并发 ping 第二台主机,依次类推。
  1. 编写脚本,显示进度条
代码语言:javascript复制
#!/bin/bash
jindu(){
while :
do
     echo  ‐n  '#'
     sleep 0.2
done
}
jindu &
cp  ‐a  $1  $2
killall  $!
echo  "拷贝完成''
  1. 进度条,动态时针版本
代码语言:javascript复制
#!/bin/bash
#定义一个显示进度的函数,屏幕快速显示|  / ‐ 
rotate_line(){
INTERVAL=0.1                 #设置间隔时间
COUNT="0"                   #设置 4 个形状的编号,默认编号为 0(不代表任何图像)
while :
do
COUNT=`expr $COUNT   1`          #执行循环,COUNT 每次循环加 1,(分别代表 4 中不同的形状)
case $COUNT in                     #判断 COUNT 的值,值不一样显示的形状就不一样
"1")                                 #值为 1 显示‐ 
          echo ‐e '‐'"bc"                     
          sleep $INTERVAL
          ;;
    "2")                               #值为 2 显示\,第一个是转义
          echo ‐e '\'"bc"
          sleep $INTERVAL
          ;;
    "3")                              #值为 3 显示|
          echo ‐e "|bc"
          sleep $INTERVAL
          ;;
   "4")                             #值为 4 显示/
          echo ‐e "/bc"
          sleep $INTERVAL
          ;;
    *)                                #值为其他时,将 COUNT 重置为 0
          COUNT="0";;
    esac
done
}
rotate_line
  1. 99 乘法表(编写 shell 脚本,打印 99 乘法表)
代码语言:javascript复制
#!/bin/bash
for  i  in  `seq 9`
do
         for  j   in  `seq $i`
         do
                     echo ‐n  "$i*$j=$[i*j]  "
         done
         echo
done
  1. 使用死循环实时显示 eth0 网卡发送的数据包流量
代码语言:javascript复制
#!/bin/bash
while :
do
          echo  '本地网卡 eth0 流量信息如下: '
          ifconfig  eth0   |  grep "RX pack"  | awk  '{print $5}'
          ifconfig  eth0   |  grep "TX pack"  | awk  '{print $5}'
          sleep 1
done
  1. 使用 user.txt 文件中的人员名单,在计算机中自动创建对应的账户并配置初始密码
代码语言:javascript复制
#!/bin/bash
#本脚本执行,需要提前准备一个 user.txt 文件,该文件中包含有若干用户名信息
for  i  in  `cat  user.txt`
do
         useradd  $i
         echo "123456" | passwd ‐‐stdin $i
done
  1. 编写批量修改扩展名脚本,如批量将 txt 文件修改为 doc 文件
代码语言:javascript复制
#!/bin/bash
#执行脚本时,需要给脚本添加位置参数
#脚本名  txt   doc(可以将 txt 的扩展名修改为 doc) #脚本名  doc  jpg(可以将 doc 的扩展名修改为 jpg)
for  i   in   "ls *.$1"
do
        mv  $i    ${i%.*}.$2
done
  1. 使用 expect 工具自动交互密码远程其他主机安装 httpd 软件
代码语言:javascript复制
#!/bin/bash
#删除~/.ssh/known_hosts 后,ssh 远程任何主机都会询问是否确认要连接该主机
rm  ‐rf  ~/.ssh/known_hosts
expect  <<EOF
spawn  ssh   192.168.4.254
expect  "yes/no"       {send  "yesr"}
#根据自己的实际情况将密码修改为真实的密码字串
expect  "password"    {send  "密码r"}
expect  "#"            {send  "yum ‐y install httpdr"}
expect  "#"            {send  "exitr"}
EOF
其他shell脚本案例

其他shell脚本案例

  1. 编写脚本快速克隆 KVM 虚拟机
  2. 编写一个点名器脚本
  3. 查看有多少远程的 IP 在连接本机(不管是通过 ssh 还是 web 还是 ftp 都统计)
  4. 对 100 以内的所有正整数相加求和(1 2 3 4… 100)
  5. 统计 13:30 到 14:30 所有访问 apache 服务器的请求有多少个
  6. 统计 13:30 到 14:30 所有访问本机 Aapche 服务器的远程 IP 地址是什么
  7. 打印国际象棋棋盘
  8. 统计每个远程 IP 访问了本机 apache 几次?
  9. 查找 Linux 系统中的僵尸进程
  10. 提示用户输入年份后测试判断是否为闰年
  11. 生成随机密码(urandom 版本)
  12. 生成随机密码(字串截取版本)
  13. 显示本机 Linux 系统上所有开放的端口列表
  14. 将 Linux 系统中 UID 大于等于 1000 的普通用户都删除
  15. 使用脚本开启关闭虚拟机
  16. 调整虚拟机内存参数的 shell 脚本
  17. 查看 KVM 虚拟机中的网卡信息(不需要进入启动或进入虚拟机)
  18. 不登陆虚拟机,修改虚拟机网卡 IP 地址

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

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/188149.html原文链接:https://javaforall.cn

0 人点赞