一、前言
Shell 脚本是 Linux 运维核心技能,日常自动化巡检、批量操作、服务管理全靠它。本文整合变量、条件测试、if 判断、for/while 循环、case 分支全套知识点,配套大量可直接运行的实战案例,覆盖课堂实验、企业监控脚本,零基础也能看懂,适合面试复习、上机实验、CSDN 学习存档。
配套学习资料:3 份 PPT 完整知识点梳理,包含命令演示、脚本源码、上机截图需求,所有代码复制即可在 CentOS/RHEL 环境运行。
二、Shell 脚本变量(基础核心)
2.1 Shell 变量分类
Shell 变量分为 4 大类,各司其职:
- 自定义变量:用户手动定义、修改,脚本最常用
- 环境变量:系统预设,全局生效,配置文件
/etc/profile、~/.bash_profile - 位置变量:接收脚本执行时传入的命令行参数
$1 $2 ${10} - 预定义变量: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 root | wc -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 条件测试两种写法
test 条件表达式[ 条件表达式 ](方括号左右必须留空格,最常用) 执行后通过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
六、知识点总结(面试速记)
- 变量:自定义变量引号区别、export 全局、expr 整数运算;环境 / 位置 / 预定义变量用途熟记
$0/$#/$*/$? - 条件测试:文件、数值、字符串、逻辑四类测试;if 单 / 双 / 多分支场景
- 循环:for 适合遍历文件列表;while 适合固定次数 / 持续条件循环,必须自增避免死循环
- case:多固定值匹配,常用于系统服务启停脚本
- 实战脚本:主机存活检测、资源监控、批量用户、网段 ARP 扫描、服务管理脚本可直接用于生产环境
七、文末福利
本文全部脚本均可直接复制运行,适配 CentOS7/8、RHEL 系列系统。后续会更新 Shell 数组、函数、定时任务 crontab 结合脚本实战,感兴趣可以收藏关注,持续更新 Linux 运维自动化系列教程!
&spm=1001.2101.3001.5002&articleId=155747401&d=1&t=3&u=7911f794704245468872cd398e77eab0)
283

被折叠的 条评论
为什么被折叠?



