一、Bash 脚本编程基础
1 脚本文件的创建和执行 1.1 创建脚本文件
使用文本编辑器(如 vim 或 nano)创建一个新的脚本文件,例如 test.sh:
vim test.sh在文件中输入以下内容:
#!/bin/bash
echo "Hello, World!"#!/bin/bash 是脚本的解释器声明,告诉系统使用 Bash 来执行该脚本。 1.2 赋予执行权限
使用 chmod 命令赋予脚本执行权限:
chmod +x test.sh1.3 执行脚本
./test.sh2 变量和数据类型 2.1 变量的定义和使用
在 Bash 中,变量不需要声明类型,直接赋值即可。例如:
name="John"
echo $name2.2 特殊变量
$0:脚本的名称。
$1, $2, ...:脚本的位置参数,即传递给脚本的参数。
$#:传递给脚本的参数个数。
$@:所有传递给脚本的参数。3.3 条件语句 3.3.1 if 语句
#!/bin/bash
num=10
if [ $num -gt 5 ]; then
echo "The number is greater than 5."
else
echo "The number is less than or equal to 5."
fi3.3.2 case 语句
#!/bin/bash
fruit="apple"
case $fruit in
"apple")
echo "It's an apple."
;;
"banana")
echo "It's a banana."
;;
*)
echo "Unknown fruit."
;;
esac3.4 循环语句 3.4.1 for 循环
#!/bin/bash
for i in 1 2 3 4 5; do
echo $i
done3.4.2 while 循环
#!/bin/bash
i=1
while [ $i -le 5 ]; do
echo $i
i=$((i + 1))
done二、Bash 脚本编程进阶
1 函数 1.1 函数的定义和调用
#!/bin/bash
function greet() {
echo "Hello, $1!"
}
greet "John"2 输入输出重定向 2.1 输出重定向
将命令的输出重定向到文件中。例如,将 ls 命令的输出保存到 file_list.txt 文件中:
ls > file_list.txt2.2 输入重定向
从文件中读取输入。例如,将 file_list.txt 文件的内容作为 wc -l 命令的输入,统计文件的行数:
wc -l < file_list.txt4.3 管道
使用管道(|)可以将一个命令的输出作为另一个命令的输入。例如,查找当前目录下包含 test 的文件:
ls | grep test三、Bash 调试和错误处理 1 调试脚本
可以使用 set -x 命令开启调试模式,在执行脚本时会显示每一行命令的执行情况:
#!/bin/bash
set -x
num=10
if [ $num -gt 5 ]; then
echo "The number is greater than 5."
else
echo "The number is less than or equal to 5."
fi
set +x2 错误处理
可以使用 $? 变量获取上一个命令的退出状态码,根据状态码进行错误处理。例如:
#!/bin/bash
ls non_existent_file
if [ $? -ne 0 ]; then
echo "The command failed."
fi四、Bash shell 日常工作脚本
1.CSV 数据处理脚本:从 CSV 文件中提取指定列的数据,并将其保存到一个新的 CSV 文件中。
#!/bin/bash
# 输入 CSV 文件
INPUT_CSV="input.csv"
# 输出 CSV 文件
OUTPUT_CSV="output.csv"
# 要提取的列号(以逗号分隔)
COLUMNS="1,3"
# 提取指定列的数据
cut -d ',' -f $COLUMNS "$INPUT_CSV" > "$OUTPUT_CSV"
echo "已提取指定列的数据到 $OUTPUT_CSV。"2.日志清理脚本:自动清理指定目录下指定天数之前的日志文件,有助于释放磁盘空间。
#!/bin/bash
# 日志目录
LOG_DIR="/var/log"
# 保留日志的天数
DAYS=7
# 查找并删除指定天数之前的日志文件
find "$LOG_DIR" -type f -mtime +$DAYS -exec rm -f {} \;
# 输出清理信息
echo "已清理 $LOG_DIR 目录下 $DAYS 天之前的日志文件。"3.进程监控脚本:持续监控指定进程是否正在运行,若进程未运行,会尝试启动它,并反馈启动结果。
#!/bin/bash
# 要监控的进程名
PROCESS_NAME="nginx"
# 检查进程是否正在运行
if pgrep -x "$PROCESS_NAME" >/dev/null; then
echo "$PROCESS_NAME 正在运行。"
else
echo "$PROCESS_NAME 未运行,尝试启动..."
systemctl start "$PROCESS_NAME"
if [ $? -eq 0 ]; then
echo "$PROCESS_NAME 已成功启动。"
else
echo "启动 $PROCESS_NAME 失败。"
fi
fi4.磁盘使用监控脚本:定期检查系统磁盘的使用情况,一旦使用率超过设定的阈值,就会发出警告。
#!/bin/bash
# 磁盘使用率阈值(百分比)
THRESHOLD=80
# 获取磁盘使用情况
DISK_USAGE=$(df -h / | awk 'NR==2 {print $5}' | sed 's/%//')
# 检查磁盘使用率是否超过阈值
if [ $DISK_USAGE -gt $THRESHOLD ]; then
echo "警告:磁盘使用率已超过 $THRESHOLD%,当前使用率为 $DISK_USAGE%。"
else
echo "磁盘使用正常,当前使用率为 $DISK_USAGE%。"
fi5.文件备份脚本:它会将指定源目录下的文件打包压缩成一个以日期命名的备份文件,并存储到指定的备份目录中。
#!/bin/bash
# 源目录
SOURCE_DIR="/path/to/source"
# 备份目录
BACKUP_DIR="/path/to/backup"
# 检查备份目录是否存在,不存在则创建
if [ ! -d "$BACKUP_DIR" ]; then
mkdir -p "$BACKUP_DIR"
fi
# 获取当前日期
DATE=$(date +%Y%m%d)
# 备份文件名
BACKUP_FILE="$BACKUP_DIR/backup_$DATE.tar.gz"
# 创建备份
tar -zcvf "$BACKUP_FILE" "$SOURCE_DIR"
# 检查备份是否成功
if [ $? -eq 0 ]; then
echo "备份成功: $BACKUP_FILE"
else
echo "备份失败"
fi