脚本

一、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.sh

1.3 执行脚本

./test.sh

2 变量和数据类型 2.1 变量的定义和使用

在 Bash 中,变量不需要声明类型,直接赋值即可。例如:

name="John"
echo $name

2.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."
fi

3.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."
        ;;
esac

3.4 循环语句 3.4.1 for 循环

#!/bin/bash
for i in 1 2 3 4 5; do
    echo $i
done

3.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.txt

2.2 输入重定向

从文件中读取输入。例如,将 file_list.txt 文件的内容作为 wc -l 命令的输入,统计文件的行数:

wc -l < file_list.txt

4.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 +x

2 错误处理

可以使用 $? 变量获取上一个命令的退出状态码,根据状态码进行错误处理。例如:

#!/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
fi

4.磁盘使用监控脚本:定期检查系统磁盘的使用情况,一旦使用率超过设定的阈值,就会发出警告。

#!/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%。"
fi

5.文件备份脚本:它会将指定源目录下的文件打包压缩成一个以日期命名的备份文件,并存储到指定的备份目录中。

#!/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