一、什么是 Shell 脚本?
Shell 脚本是一种用 Shell 编写的脚本程序,用于执行一系列的命令。它是 Linux/Unix 系统中自动化管理任务的利器,能够显著提升工作效率,特别适合批量处理文件、监控系统状态、自动部署等任务。
二、Shell 脚本的基础语法
1. 脚本结构
- Shebang 行:指定解释器路径。
#!/bin/bash
- 注释:以
#
开头的内容表示注释。# 这是一个注释
2. 变量
- 定义变量:
NAME="Linux"
- 使用变量:
echo "Welcome to $NAME"
- 读取用户输入:
read USERNAME echo "Hello, $USERNAME"
3. 条件语句
- if 结构:
if [ condition ]; then echo "Condition met" else echo "Condition not met" fi
- 条件操作符:
- 文件判断:
-e
(存在)、-d
(目录)、-f
(文件)。 - 数值比较:
-eq
(等于)、-gt
(大于)、-lt
(小于)。 - 字符串比较:
=
(等于)、!=
(不等)。
- 文件判断:
4. 循环
- for 循环:
for i in {1..5}; do echo "Iteration $i" done
- while 循环:
counter=1 while [ $counter -le 5 ]; do echo "Count: $counter" ((counter++)) done
5. 函数
- 定义函数:
my_function() { echo "This is a function" }
- 调用函数:
my_function
三、Shell 脚本实战案例
1. 文件批量处理
需求:批量将 .log
文件重命名为带时间戳的文件名。
代码示例:
#!/bin/bash
for file in *.log; do
timestamp=$(date +%Y%m%d_%H%M%S)
mv "$file" "${file%.log}_$timestamp.log"
echo "Renamed $file to ${file%.log}_$timestamp.log"
done
执行方法:
- 保存为
rename_logs.sh
。 - 运行脚本:
chmod +x rename_logs.sh ./rename_logs.sh
2. 系统监控脚本
需求:定时监控系统的 CPU 和内存使用情况。
代码示例:
#!/bin/bash
while true; do
echo "CPU Usage: $(top -bn1 | grep "Cpu(s)" | awk '{print $2 + $4}')%"
echo "Memory Usage: $(free -m | awk '/Mem:/ {printf "%.2f%%\n", $3/$2 * 100}')"
sleep 5
done
执行方法:
chmod +x monitor.sh
./monitor.sh
3. 自动备份脚本
需求:自动将指定目录下的文件压缩备份到 /backup
目录,并保留最近 7 天的备份。
代码示例:
#!/bin/bash
SOURCE_DIR="/path/to/source"
BACKUP_DIR="/backup"
DATE=$(date +%Y%m%d)
mkdir -p "$BACKUP_DIR"
tar -czf "$BACKUP_DIR/backup_$DATE.tar.gz" "$SOURCE_DIR"
# 删除 7 天前的备份
find "$BACKUP_DIR" -type f -mtime +7 -exec rm -f {} \;
echo "Backup completed and old backups cleaned."
执行方法:
chmod +x backup.sh
./backup.sh
4. 自动检测网络状态
需求:检测一组 IP 地址是否可达,并记录到日志文件。
代码示例:
#!/bin/bash
IP_LIST=("8.8.8.8" "1.1.1.1" "192.168.0.1")
LOG_FILE="network_status.log"
for ip in "${IP_LIST[@]}"; do
if ping -c 1 $ip > /dev/null 2>&1; then
echo "$(date): $ip is reachable" >> $LOG_FILE
else
echo "$(date): $ip is unreachable" >> $LOG_FILE
fi
done
执行方法:
chmod +x check_network.sh
./check_network.sh
5. 用户管理脚本
需求:批量创建用户并设置默认密码。
代码示例:
#!/bin/bash
USER_LIST=("user1" "user2" "user3")
DEFAULT_PASSWORD="password123"
for user in "${USER_LIST[@]}"; do
if id "$user" &>/dev/null; then
echo "User $user already exists."
else
useradd "$user"
echo "$DEFAULT_PASSWORD" | passwd --stdin "$user"
echo "User $user created with default password."
fi
done
执行方法:
sudo chmod +x create_users.sh
sudo ./create_users.sh
四、Shell 脚本调试与优化
1. 调试脚本
- 开启调试模式:添加
set -x
,逐行输出执行过程。set -x
- 检查错误:使用
$?
检查上一条命令的执行结果。
2. 提高脚本效率
- 使用
xargs
批量处理:ls *.log | xargs rm
- 避免使用子进程,尽量用内建命令。
3. 增强可读性
- 增加注释,解释每段代码的功能。
- 使用函数组织代码逻辑。
五、Shell 脚本进阶技巧
1. 使用数组
- 定义数组:
my_array=("value1" "value2" "value3")
- 遍历数组:
for item in "${my_array[@]}"; do echo $item done
2. 使用正则表达式
- 匹配字符串:
if [[ $string =~ ^[0-9]+$ ]]; then echo "This is a number." fi
3. 捕获信号
- 捕获
Ctrl+C
信号并执行清理操作:trap "echo 'Interrupt signal received'; exit" SIGINT
六、Shell 脚本学习资源
1. 推荐书籍
- 《Shell 编程技术》
- 《Linux Shell 脚本攻略》
2. 在线资源
- Linux Command
- B 站 Shell 脚本入门教程。
3. 实践平台
- 使用本地虚拟机(如 VirtualBox)或云服务器(如 AWS、Google Cloud)。
七、总结
Shell 脚本是 Linux 系统管理的重要工具,其简单、高效、灵活的特性使其在自动化操作中不可或缺。通过掌握基础语法和实战案例,你可以在工作中实现各种自动化任务,提升工作效率。
下一步实践:
- 将上述案例改进为适应你的实际需求。
- 学习结合
awk
和sed
编写更复杂的脚本。 - 使用定时任务(
crontab
)将脚本应用到生产环境。