一、基础概念
1. 创建脚本
#!/bin/bash
# 第一行必须是shebang,指定解释器
# 这是一个简单的shell脚本
2. 脚本结构示例
#!/bin/bash
# 脚本说明
# 作者:xxx
# 日期:2024-01-01
# 定义变量
name="World"
count=10
# 主程序
echo "Hello, $name!"
echo "当前时间: $(date)"
二、基本语法
1. 变量
# 定义变量
name="张三"
age=25
PATH="/usr/local/bin:$PATH"
# 使用变量
echo "姓名: $name"
echo "年龄: ${age}岁"
# 只读变量
readonly PI=3.14159
# 删除变量
unset name
2. 输入输出
# 输出
echo "Hello World"
printf "姓名: %s\n" "$name"
# 输入
read -p "请输入姓名: " username
read -s -p "请输入密码: " password
3. 条件判断
# if语句
if [ $num -gt 10 ]; then
echo "大于10"
elif [ $num -eq 10 ]; then
echo "等于10"
else
echo "小于10"
fi
# 条件判断符
# 数值比较: -eq, -ne, -gt, -lt, -ge, -le
# 字符串比较: =, !=, -z, -n
# 文件测试: -e, -f, -d, -r, -w, -x
4. 循环
# for循环
for i in {1..5}; do
echo "第$i次"
done
for file in *.txt; do
echo "处理文件: $file"
done
# while循环
count=1
while [ $count -le 5 ]; do
echo "计数: $count"
((count++))
done
# until循环
until [ $count -gt 5 ]; do
echo "计数: $count"
((count++))
done
5. 函数
# 定义函数
function say_hello() {
local name=$1
echo "Hello, $name!"
return 0
}
# 调用函数
say_hello "World"
# 获取返回值
result=$?
三、实用示例
1. 系统信息脚本
#!/bin/bash
# sysinfo.sh - 显示系统信息
echo "===== 系统信息 ====="
echo "主机名: $(hostname)"
echo "系统版本: $(cat /etc/os-release | grep PRETTY_NAME)"
echo "内核版本: $(uname -r)"
echo "CPU信息: $(lscpu | grep "Model name")"
echo "内存使用: $(free -h | awk '/^Mem:/ {print $3 "/" $2}')"
echo "磁盘空间:"
df -h / | awk 'NR==2 {print $3 "/" $2 " (" $5 ")"}'
2. 备份脚本
#!/bin/bash
# backup.sh - 文件备份脚本
BACKUP_DIR="/backup"
SOURCE_DIR="/home/user/documents"
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="backup_$DATE.tar.gz"
# 创建备份目录
mkdir -p $BACKUP_DIR
# 执行备份
tar -czf "$BACKUP_DIR/$BACKUP_FILE" "$SOURCE_DIR"
# 检查是否成功
if [ $? -eq 0 ]; then
echo "备份成功: $BACKUP_FILE"
echo "备份大小: $(du -h $BACKUP_DIR/$BACKUP_FILE | cut -f1)"
else
echo "备份失败!" >&2
exit 1
fi
3. 监控脚本
#!/bin/bash
# monitor.sh - 监控系统资源
LOG_FILE="/var/log/system_monitor.log"
THRESHOLD=80
check_disk() {
usage=$(df / | awk 'NR==2 {print $5}' | sed 's/%//')
if [ $usage -gt $THRESHOLD ]; then
echo "$(date): 警告! 磁盘使用率: ${usage}%" >> $LOG_FILE
fi
}
check_memory() {
usage=$(free | awk '/^Mem:/ {printf("%.0f", $3/$2 * 100)}')
if [ $usage -gt $THRESHOLD ]; then
echo "$(date): 警告! 内存使用率: ${usage}%" >> $LOG_FILE
fi
}
# 主循环
while true; do
check_disk
check_memory
sleep 300 # 5分钟检查一次
done
四、调试技巧
# 1. 执行时显示每一行
bash -x script.sh
# 2. 在脚本中启用调试
#!/bin/bash
set -x # 开启调试
# 脚本内容
set +x # 关闭调试
# 3. 详细调试
set -e # 遇到错误立即退出
set -u # 使用未定义变量时报错
set -o pipefail # 管道中任何错误都视为失败
五、最佳实践
-
添加注释:说明脚本用途、参数、作者等
-
错误处理:检查命令执行结果
-
日志记录:重要操作记入日志
-
参数检查:验证输入参数
-
权限控制:使用适当权限运行
-
代码复用:将通用功能写成函数
-
配置文件:将配置与代码分离
-
版本控制:使用Git管理脚本
六、执行脚本
# 1. 添加执行权限
chmod +x script.sh
# 2. 执行脚本
./script.sh
bash script.sh
source script.sh # 在当前shell执行
# 3. 带参数执行
./script.sh arg1 arg2