Linux Shell 脚本全套精讲:变量、判断、循环、分支实战(从入门到企业监控脚本)

一、前言

Shell 脚本是 Linux 运维核心技能,日常自动化巡检、批量操作、服务管理全靠它。本文整合变量、条件测试、if 判断、for/while 循环、case 分支全套知识点,配套大量可直接运行的实战案例,覆盖课堂实验、企业监控脚本,零基础也能看懂,适合面试复习、上机实验、CSDN 学习存档。

配套学习资料:3 份 PPT 完整知识点梳理,包含命令演示、脚本源码、上机截图需求,所有代码复制即可在 CentOS/RHEL 环境运行。

二、Shell 脚本变量(基础核心)

2.1 Shell 变量分类

Shell 变量分为 4 大类,各司其职:

  1. 自定义变量:用户手动定义、修改,脚本最常用
  2. 环境变量:系统预设,全局生效,配置文件/etc/profile~/.bash_profile
  3. 位置变量:接收脚本执行时传入的命令行参数 $1 $2 ${10}
  4. 预定义变量:Bash 内置只读变量,获取脚本运行状态

2.2 自定义变量全用法

1)基础定义与查看

语法:变量名=值(等号两侧不能空格) 变量名规则:字母 / 下划线开头,区分大小写,规范建议全大写

bash

运行

# 定义变量
Product=PPT
Version=3.0
# 打印变量
echo $Product
echo $Product $Version
2)三种引号赋值区别

表格

引号特性示例
双引号""解析$变量、转义符NEW="WORD$Version" → WORD3.0
单引号''原样输出,$ 不解析CASH='USIS′→USIS
反撇号`命令替换,获取命令输出EX=`pgrep -U rootwc -l`
3)键盘输入赋值 read

bash

运行

# -p 输出提示文字
read -p "请输入循环次数:" CISHU
4)全局变量 export

默认变量仅当前 Shell 生效,export导出后子 Shell 也能读取:

bash

运行

# 方式1:已有变量导出
export Product Version
# 方式2:定义同时导出
export OS=CentOS
# 验证:新开子bash查看
bash
echo $Product
exit
5)整数运算 expr

运算符号*需要转义\*,整体用反撇号接收结果:

bash

运行

EX=87
CISHU=15
# 加减乘除取余
AK=`expr $EX + $CISHU`
AK=`expr $EX - $CISHU`
AK=`expr $EX \* $CISHU`
AK=`expr $EX / $CISHU`
AK=`expr $EX % $CISHU`
echo $AK

2.3 特殊 Shell 变量

1)系统环境变量

常用内置环境变量:PWD当前目录、PATH命令搜索路径、USER当前用户、UID用户 ID、HOME家目录、SHELL默认解释器

bash

运行

# 追加自定义命令路径
PATH="$PATH:/root"
echo $PATH
2)位置变量 $n
  • $1~$9:前 9 个参数,超过 9 位必须${10}大括号包裹 示例脚本myprog.sh

bash

运行

#!/bin/bash
echo "第5个参数:" $5
echo "第18个参数:" ${18}

执行:sh myprog.sh {a..z}

3)预定义变量(高频面试)

表格

变量含义
$0当前脚本文件名
$#传入参数总个数
$*所有传入参数内容
$?上一条命令返回值,0 = 成功,非 0 = 报错

备份脚本实战:

bash

运行

#!/bin/bash
TARFILE=beifen-`date +%Y%m%d`.tgz
tar zcf $TARFILE $* &> /dev/null
echo "执行脚本:$0"
echo "备份对象总数:$#"
echo "备份文件列表:$*"

执行:sh mybak.sh /etc/passwd /etc/shadow

三、条件测试与 if 判断语句(运维必备)

3.1 条件测试两种写法

  1. test 条件表达式
  2. [ 条件表达式 ] (方括号左右必须留空格,最常用) 执行后通过echo $?查看结果,0 成立,1 不成立。

3.2 四大测试类型

1)文件 / 目录测试

表格

参数作用
-d是否为目录
-e文件 / 目录是否存在
-f是否为普通文件
-r/-w/-x读 / 写 / 执行权限

bash

运行

# 判断目录存在
[ -d /etc/ssh ]
echo $?
# 简化写法,成立则输出YES
[ -e /dev/cdrom ] && echo "YES"
2)整数数值比较

表格

参数含义
-eq等于
-ne不等于
-gt大于
-lt小于
-ge大于等于
-le小于等于

bash

运行

# 在线用户数大于1则提示
[ $(who | wc -l) -gt 1 ] && echo "Too many."
# 获取空闲内存并判断
FreeCC=$(free -m | grep Mem | awk '{print $4}')
[ $FreeCC -lt 1024 ] && echo "${FreeCC}MB"
3)字符串比较
  • = 相等、!= 不相等、-z 字符串为空

bash

运行

# 判断系统语言
[ $LANG != "en.US" ] && echo "Not en.US"
# 输入确认
read -p "是否覆盖文件yes/no:" ACK
[ $ACK = "yes" ] && echo "开始覆盖"
4)逻辑测试
  • && / -a 逻辑与(同时成立)
  • || / -o 逻辑或(任意成立)
  • ! 逻辑非(取反)

bash

运行

[ $USER != "teacher" ] && echo "Not teacher"

3.3 if 三种分支结构(全套示例)

1)单分支 if:满足条件才执行

语法:

bash

运行

if 测试条件
then
    命令序列
fi

实战:不存在挂载目录自动创建 chkmountdir.sh

bash

运行

#!/bin/bash
MOUNT_DIR="/media/cdrom/"
if [ ! -d $MOUNT_DIR ]
then
    mkdir -p $MOUNT_DIR
fi
2)双分支 if:成立 / 不成立两套逻辑

语法:

bash

运行

if 测试条件
then
    成立执行
else
    不成立执行
fi

实战:ping 检测主机存活 pinghost.sh

bash

运行

#!/bin/bash
ping -c 3 -i 0.2 -W 3 $1 &> /dev/null
if [ $? -eq 0 ]
then
    echo "Host $1 is up."
else
    echo "Host $1 is down."
fi
3)多分支 if:多区间判断

语法:

bash

运行

if 条件1
then
    命令1
elif 条件2
then
    命令2
else
    默认命令
fi

实战:分数分级脚本 gradediv.sh

bash

运行

#!/bin/bash
read -p "输入分数(0-100):" GRADE
if [ $GRADE -ge 85 ] && [ $GRADE -le 100 ] ; then
    echo "$GRADE 分!优秀"
elif [ $GRADE -ge 70 ] && [ $GRADE -le 84 ] ; then
    echo "$GRADE 分,合格"
else
    echo "$GRADE 分?不合格"
fi

3.4 企业实战:服务器资源监控脚本 sysmon.sh

实时监控根分区、CPU、内存使用率,超阈值写入告警文件(邮件告警可扩展)

bash

运行

#!/bin/bash
# 清空上次告警
> /tmp/alert.txt
# 采集监控指标
gl=$(df -hT |grep "/$" |awk '{print $6/1}')
ul=$(mpstat  |tail -1 |awk '{print $12}' |awk -F. '{print 100 - $1}')
ml=$(free -m | awk '/Mem/' '{print $3 / ($3 + $4) * 100}' | awk -F. '{print $1}')
# 判断阈值告警
if [ $gl -gt 90 ]; then
echo "根分区使用率:${gl}% 超出告警上限90%" >> /tmp/alert.txt
fi
if [ $ul -gt 80 ]; then
echo "CPU使用率:${ul}% 超出告警上限80%" >> /tmp/alert.txt
fi
if [ $ml -gt 90 ]; then
echo "内存使用率:${ml}% 超出告警上限90%" >> /tmp/alert.txt
fi
# 存在告警则输出
[ -s /tmp/alert.txt ] && cat /tmp/alert.txt

使用前安装依赖:yum install -y sysstat

四、循环语句 for /while(批量自动化核心)

4.1 for 循环:遍历列表批量操作

语法:

bash

运行

for 变量 in 取值列表
do
    循环执行命令
done
案例 1:读取文件批量创建用户 uaddfor.sh

bash

运行

#!/bin/bash
ULIST=$(cat /root/users.txt)
for UNAME in $ULIST
do
    useradd $UNAME
    echo "123456" | passwd --stdin $UNAME
done

users.txt 内容:

plaintext

chenye
dengchao
zhangjie
案例 2:批量扫描网段主机存活 chkhosts.sh

bash

运行

#!/bin/bash
HLIST=$(cat /root/ipadds.txt)
for IP in $HLIST
do
    ping -c 3 -i 0.2 -W 3 $IP &> /dev/null
    if [ $? -eq 0 ] ; then
        echo "Host $IP is up."
    else
        echo "Host $IP is down."
    fi
done

4.2 while 循环:条件成立持续循环

语法:

bash

运行

while 条件测试
do
    循环命令
done
案例 1:循环创建 stu1~stu20 用户 uaddwhile.sh

bash

运行

#!/bin/bash
PREFIX="stu"
i=1
while [ $i -le 20 ]
do
    useradd ${PREFIX}$i
    echo "123456" | passwd --stdin ${PREFIX}$i &> /dev/null
    let i++  # 自增,防止死循环
done
案例 2:随机数猜价格游戏 pricegame.sh

bash

运行

#!/bin/bash
PRICE=$(expr $RANDOM % 1000)
TIMES=0
echo "商品价格0-999,开始猜测!"
while true
do
    read -p "输入猜测价格:" INT
    let TIMES++
    if [ $INT -eq $PRICE ] ; then
        echo "答对!价格$PRICE,共猜$TIMES次"
        exit 0
    elif [ $INT -gt $PRICE ] ; then
        echo "太高了!"
    else
        echo "太低了!"
    fi
done
案例 3:网段 ARP 扫描采集 MAC 地址 getarp.sh

bash

运行

#!/bin/bash
NADD="192.168.0."
FILE="/etc/ethers"
# 备份原有地址映射
[ -f $FILE ] && /bin/cp -f $FILE $FILE.old
HADD=1
while [ $HADD -lt 254 ]
do
    arping -c 2 -w 1 ${NADD}${HADD} &> /dev/null
    if [ $? -eq 0 ]
    then
        arp -n |grep ${NADD}${HADD} |awk '{print $1,$3}' >> $FILE
    fi
    let HADD++
done

依赖安装:yum install net-tools arping

五、case 多分支匹配语句(服务脚本专用)

5.1 case 标准语法

bash

运行

case 变量 in
模式1)
    命令1
    ;;
模式2)
    命令2
    ;;
*)
    默认兜底命令
esac

案例 1:判断输入字符类型 hitkey.sh

bash

运行

#!/bin/bash
read -p "输入一个字符:" KEY
case "$KEY" in
  [a-z]|[A-Z])
      echo "输入的是字母"
      ;;
  [0-9])
      echo "输入的是数字"
      ;;
  *)
      echo "其他符号/功能键"
esac

案例 2:标准 Linux 服务启停脚本(可 chkconfig 管理)

文件路径/etc/init.d/myprog

bash

运行

#!/bin/bash
# chkconfig: - 90 10
# description: Shell Demo Service
case "$1" in
start)
    echo "服务启动成功"
    ;;
stop)
    echo "服务停止成功"
    ;;
restart)
    $0 stop
    $0 start
    ;;
*)
    echo "用法: $0 {start|stop|restart}"
esac

注册开机自启:

bash

运行

chmod +x /etc/init.d/myprog
chkconfig --add myprog
chkconfig --list myprog

六、知识点总结(面试速记)

  1. 变量:自定义变量引号区别、export 全局、expr 整数运算;环境 / 位置 / 预定义变量用途熟记$0/$#/$*/$?
  2. 条件测试:文件、数值、字符串、逻辑四类测试;if 单 / 双 / 多分支场景
  3. 循环:for 适合遍历文件列表;while 适合固定次数 / 持续条件循环,必须自增避免死循环
  4. case:多固定值匹配,常用于系统服务启停脚本
  5. 实战脚本:主机存活检测、资源监控、批量用户、网段 ARP 扫描、服务管理脚本可直接用于生产环境

七、文末福利

本文全部脚本均可直接复制运行,适配 CentOS7/8、RHEL 系列系统。后续会更新 Shell 数组、函数、定时任务 crontab 结合脚本实战,感兴趣可以收藏关注,持续更新 Linux 运维自动化系列教程!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值