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 背后发生了什么?

从操作系统角度分析

  1. 硬件层:CPU、内存、磁盘、显卡、音箱、键盘鼠标等
  2. 软件层:应用程序(QQ、微信、腾讯会议)
  3. 操作系统:内核(操作硬件的核心)

内核的作用

  • 对CPU进行管理:运行进程的地方
  • 对内存进行管理:进程临时存放数据的地方
  • 对磁盘进行管理:存放数据
  • 对进程进行管理:创建进程、调度、杀死等
  • 对其他硬件进行管理

系统调用:操作系统内核给应用程序调用的接口

12.2 useradd命令执行过程

useradd qiqiqi 背后发生的完整过程:

  1. Shell命令解析过程
    • Shell解释器获取命令
    • 解析和查找useradd命令位置
  2. useradd进程创建过程 → 进程的组成
  3. 调度过程 → CPU从内存获取数据
  4. 磁盘读写 → 文件的存取管理

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    |                |
+-------------+--------------+------+-----+---------+----------------+
Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐