Shell脚本编程与Linux系统管理
·
1. 文件操作与内容清空
清空文件内容可以使用重定向符号 >。
# 清空 user_pwd.txt 文件内容
> user_pwd.txt
# 或使用 cat 命令
cat /dev/null > user_pwd.txt
2. 算术运算
2.1 双圆括号整数运算
双圆括号 (( )) 只能进行整数的运算和比较。
# 生成10以内的随机数
echo $(( $RANDOM % 10 ))
# 输出示例:5
生成10-19范围内的随机数
echo $(( $RANDOM % 10 + 10 ))
输出示例:14
2.2 bc工具小数运算
使用 bc 工具进行小数运算,需要先安装:
yum install bc -y
基本运算示例:
# 小数乘法
echo "8.9 * 5.7" | bc
# 输出:50.7
设置精度为2位小数进行除法
echo "scale=2 ; 8.9 / 5.7" | bc
输出:1.56
3. 命令返回值与逻辑运算
3.1 输出值与返回值
- 输出值:在屏幕上看到的命令执行结果
- 返回值:
$?变量,判断命令执行成功(0)还是失败(非0)
3.2 bc进行数值比较
a=5.6
b=8.9
直接输出比较表达式
echo "$a > $b"
输出:5.6 > 8.9
使用bc进行数值比较
echo "$a > $b" | bc
输出:0(表示不正确)
echo "$a < $b" | bc
输出:1(表示正确)
检查命令返回值
echo "$a > $b" | bc
echo $?
输出:0(bc命令执行成功)
注意:bc进行数值比较时,输出值1表示正确(true),0表示不正确(false)。
3.3 逻辑运算符
# command1 && command2:命令1执行成功,才执行命令2
command1 && command2
command1 || command2:命令1执行失败,才执行命令2
command1 || command2
组合使用:命令1成功执行命令2,失败执行命令3
command1 && command2 || command3
4. 字符串比较
使用双中括号 [[ ]] 进行字符串比较:
city="big changsha"
[[ $city == "big changsha" ]]
echo $?
# 输出:0(比较成功)
5. 实战:登录验证脚本
编写一个脚本判断用户名和密码是否正确:
#!/bin/bash
# 使用方法:bash login.sh admin 123456
username=$1
userpwd=$2
if [[ $username == "admin" ]] && [[ $userpwd == "123456" ]]; then
echo "登录成功"
else
echo "登录失败"
fi
测试示例:
# 错误密码
bash login.sh admin 123
# 输出:登录失败
正确密码
bash login.sh admin 123456
输出:登录成功
6. 文件判断
使用test命令或中括号进行文件判断:
# 判断是否为目录且存在
[ -d /boot ]
test -d /boot
判断是否为文件且存在
[ -f /etc/passwd ]
test -f /etc/passwd
判断文件或目录是否存在
[ -e /etc/passwd ]
判断文件权限
[ -r /etc/passwd ] # 是否有读权限
[ -w /etc/passwd ] # 是否有写权限
[ -x /etc/passwd ] # 是否有执行权限
7. 字符串判断
# 判断字符串长度是否非空
[ -n "$变量" ]
[ -n string ]
判断字符串是否为空
[ -z "$变量" ]
[ -z string ]
记忆技巧:
-n:not zero(非零长度)-z:zero length(零长度)
8. while循环
8.1 控制循环次数
#!/bin/bash
echo "while循环"
i=1
while (( i <= 5 ))
do
echo "s $i"
sleep 1
(( i++ ))
done
8.2 死循环
#!/bin/bash
i=1
while true # 或 while :
do
echo "s $i"
(( i++ ))
done
8.3 读取文件
#!/bin/bash
# 将第一行排除,从第二行开始进入while循环
tail -n +2 grade.txt | while read name sex chinese math english
do
if (( $chinese >= 90 )); then
echo "$name $chinese $english"
fi
done
9. read读取用户输入
# 方法1:先输出提示,再读取
echo "请输入数字:" # 先输出提示文字
read num # 再读取输入赋值给num
方法2:使用-p参数(推荐)
read -p "请输入数字:" num
10. seq序列生成
# 产生1~4数值的序列
seq 4
# 输出:1 2 3 4
产生4~8数值的序列
seq 4 8
输出:4 5 6 7 8
产生4~8数值的序列,步长为2
seq 4 2 8
输出:4 6 8
11. 信号管理
# 查看所有信号
kill -l
常用信号:
9) SIGKILL 强制杀死(无法被屏蔽)
15) SIGTERM 终止信号(让进程自己结束)
2) SIGINT 中断信号(等同于Ctrl+C)
12. Linux系统深入理解
12.1 一切皆文件
问题:useradd qiqiqi 背后发生了什么?
从操作系统角度分析:
- 硬件层:CPU、内存、磁盘、显卡、音箱、键盘鼠标等
- 软件层:应用程序(QQ、微信、腾讯会议)
- 操作系统:内核(操作硬件的核心)
内核的作用:
- 对CPU进行管理:运行进程的地方
- 对内存进行管理:进程临时存放数据的地方
- 对磁盘进行管理:存放数据
- 对进程进行管理:创建进程、调度、杀死等
- 对其他硬件进行管理
系统调用:操作系统内核给应用程序调用的接口
12.2 useradd命令执行过程
useradd qiqiqi 背后发生的完整过程:
- Shell命令解析过程
- Shell解释器获取命令
- 解析和查找useradd命令位置
- useradd进程创建过程 → 进程的组成
- 调度过程 → CPU从内存获取数据
- 磁盘读写 → 文件的存取管理
useradd改动哪些文件和目录?
useradd qiqiqi 主要涉及:
/etc/passwd:添加用户信息/etc/shadow:添加密码信息(如有设置)/etc/group:添加用户组信息/home/caoenqi:创建用户家目录/etc/skel/:复制骨架文件到用户家目录
13. 成绩等级判断脚本
编写一个脚本根据用户输入的成绩判断等级:
#!/bin/bash
# time:xxx
# author:xxx
# email:xxx@qq.com
grade=$1
输入验证:只能输入整数
if echo $grade | grep [^0-9]; then
echo "请不要输入字母和特殊符号或者小数,只能输入整数,而且范围是0~100"
exit
fi
成绩等级判断
if (( $grade >= 0 && $grade < 60 )); then
echo "您的等级为:D"
elif (( $grade >= 60 && $grade < 70 )); then
echo "您的等级为:C"
elif (( $grade >= 70 && $grade < 86 )); then
echo "您的等级为:B"
elif (( $grade >= 86 && $grade <= 100 )); then
echo "您的成绩为:A"
else
echo "请输入正确的成绩(0~100)!"
fi
测试示例:
# 正常成绩
bash grade.sh 70
# 输出:您的等级为:B
非法输入(包含字母和小数)
bash grade.sh nvai28.2
输出:请不要输入字母和特殊符号或者小数,只能输入整数,而且范围是0~100
超出范围
bash grade.sh 888
输出:请输入正确的成绩(0~100)!
14. CPU监控与数据库存储脚本
14.1 MySQL环境准备
首先创建数据库、用户和表结构:
# 登录MySQL
mysql -uroot -p
创建用户sc,允许从任意主机登录
mysql> CREATE USER 's'@'%' IDENTIFIED BY 's123456';
Query OK, 0 rows affected (0.01 sec)
授权sc用户所有权限
mysql> GRANT ALL ON . TO 's'@'%';
Query OK, 0 rows affected (0.01 sec)
创建监控数据库
mysql> CREATE DATABASE monitor;
Query OK, 1 row affected (0.00 sec)
使用monitor数据库
mysql> USE monitor;
Database changed
创建CPU使用率信息表
mysql> CREATE TABLE cpu_useinfo(
id INT AUTO_INCREMENT PRIMARY KEY,
logtime DATETIME,
hostname VARCHAR(20),
cpu_percent DECIMAL(5,2),
flag CHAR(1)
);
Query OK, 0 rows affected (0.00 sec)
退出MySQL
mysql> EXIT
14.2 手动插入测试数据
# 在Linux中执行MySQL语句插入数据
mysql -us -p's123456' -e "INSERT INTO monitor.cpu_useinfo(id, logtime, hostname, cpu_percent, flag) VALUES(1, '2026-1-20 15:04:55', 'sdb', 25.5, '0')"
查看表数据
mysql -us -p's123456' -e "SELECT * FROM monitor.cpu_useinfo"
14.3 自动监控脚本
#!/bin/bash
# monitor_cpu.sh - CPU使用率监控脚本
hostname=$(hostname)
logtime=$(date +"%F %H:%M:%S")
获取CPU空闲百分比,删除空格和"id"字符
cpu_percent=$(top -bn 1 | grep Cpu | awk -F',' '{print $4}' | tr -d ' id')
判断CPU使用率是否超过60%
if [ $(echo "$cpu_percent >= 60" | bc -l) -eq 1 ]; then
flag=1 # 超过阈值
else
flag=0 # 正常范围
fi
数据入库
mysql -us -p's123456' -e "INSERT INTO monitor.cpu_useinfo(logtime, hostname, cpu_percent, flag) VALUES('$logtime', '$hostname', $cpu_percent, '$flag')"
脚本说明:
top -bn 1:获取CPU静态快照(-n 1表示只输出一次结果)awk -F',' '{print $4}':提取第4个字段(空闲CPU百分比)tr -d ' id':删除空格和"id"字符,只保留数字bc -l:使用bc进行浮点数比较
测试结果:
# 多次执行脚本
bash monitor_cpu.sh
查看监控数据
mysql -us -p's123456' -e "SELECT * FROM monitor.cpu_useinfo"
示例输出:
+----+---------------------+----------+-------------+------+
| id | logtime | hostname | cpu_percent | flag |
+----+---------------------+----------+-------------+------+
| 12 | 2026-01-20 16:33:58 | qiqiqi | 100.00 | 1 |
| 13 | 2026-01-20 16:34:19 | qiqiqi | 100.00 | 1 |
| 14 | 2026-01-20 16:39:14 | qiqiqi | 95.20 | 0 |
| 15 | 2026-01-20 16:39:54 | qiqiqi | 100.00 | 1 |
| 16 | 2026-01-20 16:48:45 | qiqiqi | 95.50 | 1 |
+----+---------------------+----------+-------------+------+
15. 猜幸运数游戏
#!/bin/bash
# author:曹恩琪
# email:2056024059@qq.com
生成0-9的随机幸运数字
Lucky=$(( RANDOM % 10 ))
count=1
echo "猜数字游戏开始!幸运数字在0-9之间。"
循环猜数字
while true
do
read -p "请输入数字:" num
# 判断是否猜中
if (( $num == $Lucky )); then
break
else
echo "请再试一次吧"
count=$(( count + 1 ))
fi
done
根据猜测次数给出不同评价
if (( count == 1 )); then
echo "666第一次就蒙到了,幸运数字为$num"
elif (( count >= 2 && count <= 5 )); then
echo "老弟还得练,$count次才猜中,幸运数字为$num"
else
echo "神人,$count次才猜中,幸运数字为$num"
fi
游戏特点:
- 使用
$(( RANDOM % 10 ))生成0-9的随机数 - 使用
while true实现无限循环,直到猜中为止 - 使用
read -p提示用户输入 - 根据猜测次数给出不同的评价反馈
15.1 数据库表结构查看
查看已创建的监控表结构:
# 查看表结构
mysql -us -p's123456' -e "DESC monitor.cpu_useinfo"
输出示例:
+-------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+--------------+------+-----+---------+----------------+
| id | int | NO | PRI | NULL | auto_increment |
| logtime | datetime | YES | | NULL | |
| hostname | varchar(20) | YES | | NULL | |
| cpu_percent | decimal(5,2) | YES | | NULL | |
| flag | char(1) | YES | | NULL | |
+-------------+--------------+------+-----+---------+----------------+
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐

所有评论(0)