简介
对于寻求自动化重复任务并提高工作流程效率的 Linux 系统管理员和开发人员来说,Shell 脚本编程是一项至关重要的技能。本全面教程深入探讨了 bash 脚本编程的基础知识,涵盖了从基本脚本结构到高级自动化技术的所有内容,这些技术可以改变你管理 Linux 系统的方式。
对于寻求自动化重复任务并提高工作流程效率的 Linux 系统管理员和开发人员来说,Shell 脚本编程是一项至关重要的技能。本全面教程深入探讨了 bash 脚本编程的基础知识,涵盖了从基本脚本结构到高级自动化技术的所有内容,这些技术可以改变你管理 Linux 系统的方式。
Shell 脚本编程是在 Linux 系统中自动化任务的一种强大方法。作为 Linux Shell 脚本编程的一项基本技能,bash 编程使系统管理员和开发人员能够创建高效的命令行解决方案。
一个典型的 bash 脚本遵循特定的结构:
#!/bin/bash
## 这是一条注释
echo "你好,Linux Shell!"
| 组件 | 描述 | 示例 |
|---|---|---|
| 哈希磅符号 | 指定解释器 | #!/bin/bash |
| 注释 | 解释性文本 | ## 这是一条注释 |
| 命令 | Linux Shell 命令 | echo、ls、mkdir |
Shell 脚本支持各种变量类型:
## 字符串变量
name="Ubuntu"
## 整数变量
count=10
## 数组示例
servers=("web01" "db01" "app01")
if [ $count -gt 5 ]; then
echo "Count 大于 5"
else
echo "Count 小于或等于 5"
fi
for server in "${servers[@]}"; do
ping -c 1 $server
done
system_info() {
echo "主机名: $(hostname)"
echo "操作系统: $(uname -o)"
}
system_info
函数可增强脚本的模块化和可重用性:
validate_input() {
local input=$1
[[ -z "$input" ]] && return 1
[[ "$input" =~ ^[0-9]+$ ]] || return 1
return 0
}
process_data() {
local data=$1
if validate_input "$data"; then
echo "有效输入: $data"
else
echo "无效输入"
fi
}
#!/bin/bash
if [ $## -eq 0 ]; then
echo "用法: $0 <参数>"
exit 1
fi
第一个参数=$1
echo "第一个参数: $第一个参数"
| 技术 | 描述 | 示例 |
|---|---|---|
| 参数数量检查 | 检查输入的数量 | $## -eq 2 |
| 类型检查 | 验证输入的类型 | [[ "$变量" =~ ^[0-9]+$ ]] |
| 范围验证 | 确保输入在限制范围内 | (( 变量 >= 1 && 变量 <= 100 )) |
log_error() {
local message=$1
echo "[错误] $(date): $message" >> error.log
exit 1
}
backup_files() {
rsync -avz /源目录/ /备份目录/ || log_error "备份失败"
}
check_system_resources() {
local cpu_usage=$(top -bn1 | grep "Cpu(s)" | awk '{print $2 + $4}')
local memory_usage=$(free | grep Mem | awk '{print $3/$2 * 100.0}')
if (($(echo "$cpu_usage > 80" | bc -l))); then
echo "检测到高CPU使用率"
fi
if (($(echo "$memory_usage > 90" | bc -l))); then
echo "高内存消耗"
fi
}
#!/bin/bash
set -x ## 启用调试模式
set -e ## 如果命令以非零状态退出,则立即退出
complex_operation() {
## 便于调试的函数
}
#!/bin/bash
BACKUP_DIR="/backup/$(date +%Y-%m-%d)"
SOURCES=("/etc" "/home" "/var/log")
create_backup() {
mkdir -p "$BACKUP_DIR"
for source in "${SOURCES[@]}"; do
rsync -avz "$source" "$BACKUP_DIR"
done
echo "备份完成: $BACKUP_DIR"
}
cleanup_old_backups() {
find /backup -type d -mtime +30 -exec rm -rf {} \;
}
create_backup
cleanup_old_backups
#!/bin/bash
monitor_system() {
local cpu_usage=$(top -bn1 | grep "Cpu(s)" | awk '{print $2 + $4}')
local memory_usage=$(free | awk '/Mem:/ {printf "%.2f", $3/$2 * 100.0}')
local disk_usage=$(df -h / | awk '/\// {print $5}')
cat << EOF > /var/log/system_health.log
系统健康报告: $(date)
CPU使用率: $cpu_usage%
内存使用率: $memory_usage%
磁盘使用率: $disk_usage
EOF
}
| 功能 | 描述 | 实现方式 |
|---|---|---|
| 日志轮转 | 管理日志文件大小 | logrotate 配置 |
| 压缩 | 减少存储空间 | 压缩旧日志 |
| 存档 | 长期存储 | 移动到备份位置 |
#!/bin/bash
LOG_DIR="/var/log/custom_logs"
MAX_LOG_SIZE=10M
rotate_logs() {
find "$LOG_DIR" -type f -size +$MAX_LOG_SIZE | while read -r log; do
gzip "$log"
mv "${log}.gz" "${log}.$(date +%Y%m%d).gz"
done
}
#!/bin/bash
check_network_status() {
local servers=("8.8.8.8" "1.1.1.1" "github.com")
local report="/tmp/network_status.txt"
> "$report"
for host in "${servers[@]}"; do
if ping -c 3 "$host" &> /dev/null; then
echo "$host: 在线" >> "$report"
else
echo "$host: 离线" >> "$report"
fi
done
}
#!/bin/bash
create_project_users() {
local project_name=$1
local team_members=("alice" "bob" "charlie")
for user in "${team_members[@]}"; do
useradd -m -g "$project_name" "$user"
echo "为项目 $project_name 创建用户: $user"
done
}
create_project_users "devops"
通过掌握 Shell 脚本编程技术,你将有能力创建强大的、模块化的脚本,这些脚本可以自动化复杂的系统任务、验证输入、处理数据,并简化管理工作流程。本教程中学到的技能将使你能够编写更高效、可维护且健壮的 bash 脚本,从而显著提高你在 Linux 环境中的工作效率。