简介
本全面的bash脚本教程为开发者和系统管理员提供了一份实用指南,用于在Unix和Linux环境中创建强大的自动化脚本。从基本脚本结构到高级技术,学习者将获得简化系统任务、提高工作流程效率以及编写健壮的 shell 脚本所需的技能。
本全面的bash脚本教程为开发者和系统管理员提供了一份实用指南,用于在Unix和Linux环境中创建强大的自动化脚本。从基本脚本结构到高级技术,学习者将获得简化系统任务、提高工作流程效率以及编写健壮的 shell 脚本所需的技能。
Bash 脚本是在 Unix 和 Linux 环境中自动化任务的强大技术。作为 Linux 命令行和 Unix shell 编程的一项基本技能,bash 脚本使系统管理员和开发者能够创建高效、可重复的工作流程。
一个典型的 bash 脚本以 shebang 行开头,并包含一系列命令:
#!/bin/bash
## 第一个 bash 脚本示例
echo "Hello, Linux World!"
组件 | 描述 | 示例 |
---|---|---|
Shebang | 指定解释器 | #!/bin/bash |
变量 | 存储数据 | name="John" |
条件语句 | 控制流程 | if [ condition ]; then |
函数 | 可重用的代码块 | function greet() { } |
#!/bin/bash
username="DevOps 工程师"
echo "欢迎,$username!"
current_date=$(date)
echo "当前日期:$current_date"
#!/bin/bash
age=25
if [ $age -ge 18 ]; then
echo "你是成年人"
else
echo "你是未成年人"
fi
要运行 bash 脚本,需设置可执行权限:
chmod +x script.sh
./script.sh
#!/bin/bash
trap 'echo "Error occurred!"; exit 1' ERR
function critical_operation() {
[[ $? -ne 0 ]] && exit 1
}
#!/bin/bash
declare -A servers=(
[web]="nginx"
[db]="postgresql"
[cache]="redis"
)
for service in "${!servers[@]}"; do
status=$(systemctl is-active "${servers[$service]}")
case $status in
active)
echo "$service is running"
;;
inactive)
echo "$service is stopped"
;;
esac
done
技术 | 描述 | 性能影响 |
---|---|---|
命令替换 | 使用 $() |
比反引号更快 |
局部变量 | 作用域限制 | 减少内存使用 |
参数扩展 | 动态变量操作 | 高效的字符串处理 |
#!/bin/bash
process_data() {
local input=$1
## 复杂的数据处理
}
for file in /data/*.log; do
process_data "$file" &
done
wait
#!/bin/bash
generate_config() {
local service=$1
local port=$2
cat << EOF > "/etc/services/${service}.conf"
service_name=$service
listen_port=$port
EOF
}
generate_config "webserver" 8080
#!/bin/bash
while getopts ":h:p:" opt; do
case $opt in
h)
host="$OPTARG"
;;
p)
port="$OPTARG"
;;
\?)
echo "Invalid option"
;;
esac
done
#!/bin/bash
LOG_DIR="/var/log/system_health"
mkdir -p $LOG_DIR
monitor_system() {
## CPU 使用情况
echo "CPU 使用情况: $(top -bn1 | grep "Cpu(s)" | awk '{print $2 + $4"%"}')" >> $LOG_DIR/system_health.log
## 内存使用情况
free -h | grep Mem: >> $LOG_DIR/system_health.log
## 磁盘空间
df -h / >> $LOG_DIR/system_health.log
}
alert_critical_conditions() {
local cpu_usage=$(top -bn1 | grep "Cpu(s)" | awk '{print $2 + $4}')
if (($(echo "$cpu_usage > 80" | bc -l))); then
mail -s "高 CPU 警报" [email protected] < $LOG_DIR/system_health.log
fi
}
monitor_system
alert_critical_conditions
#!/bin/bash
BACKUP_DIRS=("/home" "/etc" "/var/www")
BACKUP_DESTINATION="/mnt/backup"
DATE=$(date +"%Y%m%d")
create_backup() {
for dir in "${BACKUP_DIRS[@]}"; do
tar -czf "$BACKUP_DESTINATION/backup_${dir//\//_}_$DATE.tar.gz" "$dir"
done
}
rotate_backups() {
find "$BACKUP_DESTINATION" -type f -mtime +30 -delete
}
create_backup
rotate_backups
#!/bin/bash
CRITICAL_SERVICES=(
"google.com:80"
"github.com:443"
"company-internal-service:8080"
)
check_network() {
for service in "${CRITICAL_SERVICES[@]}"; do
host=$(echo "$service" | cut -d: -f1)
port=$(echo "$service" | cut -d: -f2)
timeout 5 bash -c "</dev/tcp/$host/$port" 2> /dev/null
if [ $? -eq 0 ]; then
echo "$host:$port 在线"
else
echo "$host:$port 离线"
## 可选:发送警报
fi
done
}
check_network
功能 | 描述 | 命令 |
---|---|---|
启动服务 | 启动关键服务 | systemctl start |
检查状态 | 验证服务健康状况 | systemctl status |
重启服务 | 从故障中恢复 | systemctl restart |
#!/bin/bash
LOG_PATHS=(
"/var/log/nginx/access.log"
"/var/log/mysql/slow-query.log"
)
rotate_logs() {
for log in "${LOG_PATHS[@]}"; do
if [ -f "$log" ]; then
mv "$log" "$log.$(date +%Y%m%d)"
touch "$log"
chmod 640 "$log"
fi
done
}
compress_old_logs() {
find /var/log -type f -name "*.log.*" -mtime +7 -exec gzip {} \;
}
rotate_logs
compress_old_logs
Bash 脚本编程是现代系统管理员和开发者的一项关键技能,它能在 Unix 和 Linux 平台上实现强大的自动化功能以及高效的任务管理。通过掌握脚本结构、变量、条件语句和错误处理技术,专业人员能够创建复杂的脚本,从而简化复杂的系统操作并提高技术环境中的工作效率。