30个关于Shell脚本的经典案例(上)
发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,对于初学者而言,因为没有实战经验,写不出来Shell脚本很正常,如果工作了几年的运维老年还是写不出来,那就是没主动找需求,缺乏练习,缺乏经验。针对以上问题,总结了30个生产环境中经典的Shell脚本,
千家信息网最后更新 2026年11月01日30个关于Shell脚本的经典案例(上)
| 对于初学者而言,因为没有实战经验,写不出来Shell脚本很正常,如果工作了几年的运维老年还是写不出来,那就是没主动找需求,缺乏练习,缺乏经验。针对以上问题,总结了30个生产环境中经典的Shell脚本,通过这些需求案例,希望能帮助大家提升Shell编写思路,掌握编写技巧。 |
先了解下编写Shell过程中注意事项:
开头加解释器:#!/bin/bash语法缩进,使用四个空格;多加注释说明。命名建议规则:变量名大写、局部变量小写,函数名小写,名字体现出实际作用。默认变量是全局的,在函数中变量local指定为局部变量,避免污染其他作用域。有两个命令能帮助我调试脚本:set -e 遇到执行非0时退出脚本,set-x 打印执行过程。写脚本一定先测试再到生产上。
1、获取随机字符串或数字
获取随机8位字符串:方法1:# echo $RANDOM |md5sum |cut -c 1-8471b94f2方法2:# openssl rand -base64 4vg3BEg==方法3:# cat /proc/sys/kernel/random/uuid |cut -c 1-8ed9e032c获取随机8位数字:方法1:# echo $RANDOM |cksum |cut -c 1-823648321方法2:# openssl rand -base64 4 |cksum |cut -c 1-838571131方法3:# date +%N |cut -c 1-869024815cksum:打印CRC效验和统计字节
2、定义一个颜色输出字符串函数
方法1:function echo_color() { if [ $1 == "green" ]; then echo -e "\033[32;40m$2\033[0m" elif [ $1 == "red" ]; then echo -e "\033[31;40m$2\033[0m" fi}方法2:function echo_color() { case $1 in green) echo -e "[32;40m$2[0m" ;; red) echo -e "[31;40m$2[0m" ;; *) echo "Example: echo_color red string" esac}使用方法:echo_color green "test"function关键字定义一个函数,可加或不加。3、批量创建用户
#!/bin/bashDATE=$(date +%F_%T)USER_FILE=user.txtecho_color(){ if [ $1 == "green" ]; then echo -e "[32;40m$2[0m" elif [ $1 == "red" ]; then echo -e "[31;40m$2[0m" fi}# 如果用户文件存在并且大小大于0就备份if [ -s $USER_FILE ]; then mv $USER_FILE ${USER_FILE}-${DATE}.bak echo_color green "$USER_FILE exist, rename ${USER_FILE}-${DATE}.bak"fiecho -e "User Password" >> $USER_FILEecho "----------------" >> $USER_FILEfor USER in user{1..10}; do if ! id $USER &>/dev/null; then PASS=$(echo $RANDOM |md5sum |cut -c 1-8) useradd $USER echo $PASS |passwd --stdin $USER &>/dev/null echo -e "$USER $PASS" >> $USER_FILE echo "$USER User create successful." else echo_color red "$USER User already exists!" fidone4、检查软件包是否安装
#!/bin/bashif rpm -q sysstat &>/dev/null; then echo "sysstat is already installed."else echo "sysstat is not installed!"fi
5、检查服务状态
#!/bin/bashPORT_C=$(ss -anu |grep -c 123)PS_C=$(ps -ef |grep ntpd |grep -vc grep)if [ $PORT_C -eq 0 -o $PS_C -eq 0 ]; then echo "内容" | mail -s "主题" dst@example.comfi
6、检查主机存活状态
方法1:将错误IP放到数组里面判断是否ping失败三次#!/bin/bash IP_LIST="192.168.18.1 192.168.1.1 192.168.18.2"for IP in $IP_LIST; do NUM=1 while [ $NUM -le 3 ]; do if ping -c 1 $IP > /dev/null; then echo "$IP Ping is successful." break else # echo "$IP Ping is failure $NUM" FAIL_COUNT[$NUM]=$IP let NUM++ fi done if [ ${#FAIL_COUNT[*]} -eq 3 ];then echo "${FAIL_COUNT[1]} Ping is failure!" unset FAIL_COUNT[*] fidone 方法2:将错误次数放到FAIL_COUNT变量里面判断是否ping失败三次#!/bin/bash IP_LIST="192.168.18.1 192.168.1.1 192.168.18.2"for IP in $IP_LIST; do FAIL_COUNT=0 for ((i=1;i< =3;i++)); do if ping -c 1 $IP >/dev/null; then echo "$IP Ping is successful." break else # echo "$IP Ping is failure $i" let FAIL_COUNT++ fi done if [ $FAIL_COUNT -eq 3 ]; then echo "$IP Ping is failure!" fidone方法3:利用for循环将ping通就跳出循环继续,如果不跳出就会走到打印ping失败#!/bin/bashping_success_status() { if ping -c 1 $IP >/dev/null; then echo "$IP Ping is successful." continue fi}IP_LIST="192.168.18.1 192.168.1.1 192.168.18.2"for IP in $IP_LIST; do ping_success_status ping_success_status ping_success_status echo "$IP Ping is failure!"done7、监控CPU、内存和硬盘利用率
1)CPU借助vmstat工具来分析CPU统计信息。#!/bin/bashDATE=$(date +%F" "%H:%M)IP=$(ifconfig eth0 |awk -F [ :]+ /inet addr/{print $4} ) # 只支持CentOS6MAIL="example@mail.com"if ! which vmstat &>/dev/null; then echo "vmstat command no found, Please install procps package." exit 1fiUS=$(vmstat |awk NR==3{print $13} )SY=$(vmstat |awk NR==3{print $14} )IDLE=$(vmstat |awk NR==3{print $15} )WAIT=$(vmstat |awk NR==3{print $16} )USE=$(($US+$SY))if [ $USE -ge 50 ]; then echo " Date: $DATE Host: $IP Problem: CPU utilization $USE " | mail -s "CPU Monitor" $MAILfi2)内存#!/bin/bashDATE=$(date +%F" "%H:%M)IP=$(ifconfig eth0 |awk -F [ :]+ /inet addr/{print $4} ) MAIL="example@mail.com"TOTAL=$(free -m |awk /Mem/{print $2} )USE=$(free -m |awk /Mem/{print $3-$6-$7} )FREE=$(($TOTAL-$USE))# 内存小于1G发送报警邮件if [ $FREE -lt 1024 ]; then echo " Date: $DATE Host: $IP Problem: Total=$TOTAL,Use=$USE,Free=$FREE " | mail -s "Memory Monitor" $MAILfi3)硬盘#!/bin/bashDATE=$(date +%F" "%H:%M)IP=$(ifconfig eth0 |awk -F [ :]+ /inet addr/{print $4} ) MAIL="example@mail.com"TOTAL=$(fdisk -l |awk -F [: ]+ BEGIN{OFS="="}/^Disk /dev/{printf "%s=%sG,",$2,$3} )PART_USE=$(df -h |awk BEGIN{OFS="="}/^/dev/{print $1,int($5),$6} )for i in $PART_USE; do PART=$(echo $i |cut -d"=" -f1) USE=$(echo $i |cut -d"=" -f2) MOUNT=$(echo $i |cut -d"=" -f3) if [ $USE -gt 80 ]; then echo " Date: $DATE Host: $IP Total: $TOTAL Problem: $PART=$USE($MOUNT) " | mail -s "Disk Monitor" $MAIL fidone8、批量主机磁盘利用率监控
前提监控端和被监控端SSH免交互登录或者密钥登录。写一个配置文件保存被监控主机SSH连接信息,文件内容格式:IP User Port#!/bin/bashHOST_INFO=host.infofor IP in $(awk /^[^#]/{print $1} $HOST_INFO); do USER=$(awk -v ip=$IP ip==$1{print $2} $HOST_INFO) PORT=$(awk -v ip=$IP ip==$1{print $3} $HOST_INFO) TMP_FILE=/tmp/disk.tmp ssh -p $PORT $USER@$IP df -h > $TMP_FILE USE_RATE_LIST=$(awk BEGIN{OFS="="}/^/dev/{print $1,int($5)} $TMP_FILE) for USE_RATE in $USE_RATE_LIST; do PART_NAME=${USE_RATE%=*} USE_RATE=${USE_RATE#*=} if [ $USE_RATE -ge 80 ]; then echo "Warning: $PART_NAME Partition usage $USE_RATE%!" fi donedone9、检查网站可用性
1)检查URL可用性方法1:check_url() { HTTP_CODE=$(curl -o /dev/null --connect-timeout 3 -s -w "%{http_code}" $1) if [ $HTTP_CODE -ne 200 ]; then echo "Warning: $1 Access failure!" fi}方法2:check_url() {if ! wget -T 10 --tries=1 --spider $1 >/dev/null 2>&1; then #-T超时时间,--tries尝试1次,--spider爬虫模式 echo "Warning: $1 Access failure!" fi}使用方法:check_url www.baidu.com2)判断三次URL可用性思路与上面检查主机存活状态一样。方法1:利用循环技巧,如果成功就跳出当前循环,否则执行到最后一行#!/bin/bash check_url() { HTTP_CODE=$(curl -o /dev/null --connect-timeout 3 -s -w "%{http_code}" $1) if [ $HTTP_CODE -eq 200 ]; then continue fi}URL_LIST="www.baidu.com www.agasgf.com"for URL in $URL_LIST; do check_url $URL check_url $URL check_url $URL echo "Warning: $URL Access failure!"done 方法2:错误次数保存到变量#!/bin/bash URL_LIST="www.baidu.com www.agasgf.com"for URL in $URL_LIST; do FAIL_COUNT=0 for ((i=1;i< =3;i++)); do HTTP_CODE=$(curl -o /dev/null --connect-timeout 3 -s -w "%{http_code}" $URL) if [ $HTTP_CODE -ne 200 ]; then let FAIL_COUNT++ else break fi done if [ $FAIL_COUNT -eq 3 ]; then echo "Warning: $URL Access failure!" fidone 方法3:错误次数保存到数组#!/bin/bash URL_LIST="www.baidu.com www.agasgf.com"for URL in $URL_LIST; do NUM=1 while [ $NUM -le 3 ]; do HTTP_CODE=$(curl -o /dev/null --connect-timeout 3 -s -w "%{http_code}" $URL) if [ $HTTP_CODE -ne 200 ]; then FAIL_COUNT[$NUM]=$IP #创建数组,以$NUM下标,$IP元素 let NUM++ else break fi done if [ ${#FAIL_COUNT[*]} -eq 3 ]; then echo "Warning: $URL Access failure!" unset FAIL_COUNT[*] #清空数组 fidone10、检查MySQL主从同步状态
#!/bin/bash USER=bakPASSWD=123456IO_SQL_STATUS=$(mysql -u$USER -p$PASSWD -e show slave statusG |awk -F: /Slave_.*_Running/{gsub(": ",":");print $0} ) #gsub去除冒号后面的空格for i in $IO_SQL_STATUS; do THREAD_STATUS_NAME=${i%:*} THREAD_STATUS=${i#*:} if [ "$THREAD_STATUS" != "Yes" ]; then echo "Error: MySQL Master-Slave $THREAD_STATUS_NAME status is $THREAD_STATUS!" fidone动手练一练,让你的Shell功底上升一个段位!
未完待续...
方法
变量
检查
脚本
监控
主机
函数
数组
状态
错误
循环
内存
可用性
字符
字符串
文件
次数
作用
使用方法
信息
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
上海卓越科技互联网
互联网巨头科技公司
互联网金融 科技
互联网金融 科技金融
奇酷互联网科技公司
华中科技大学互联网
广州慧亚互联网科技怎么样
中国互联网有什么科技含量
世界互联网科技公司市值排名
未来五年的互联网科技
广州市恰铎互联网科技有限公司
中国互联网十大科技股排名
996高科技互联网公司
中国互联网公司排名锤子科技
四川慕妮娅互联网科技有限公司
怎样加入科技互联网
广东工业互联网大赛深圳学泰科技
福仕德教育科技互联网
互联网科技博主张洲
现代科技的标志之一的互联网
咖啡网
新华互联网科技学校
互联网属科技
小马过河互联网科技
互联网科技公司需要的职位
中国科技互联网公司收入
移动互联网科技股
科技互联网的核心竞争力
互联网金融科技元年
互联网科技包装股