Linux/Unix系统主流脚本语言--Bash语言

🔥作者简介: 一个平凡而乐于分享的小比特,中南民族大学通信工程专业研究生,研究方向无线联邦学习

🎬擅长领域:驱动开发,嵌入式软件开发,BSP开发

❄️作者主页:一个平凡而乐于分享的小比特的个人主页

✨收录专栏:自动化脚本语言,本专栏专门讲述一些常用的自动化脚本语言,以方便日常开发

欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖💖

Linux/Unix系统主流脚本语言--Bash语言

一、Shell脚本基础

1.1 Shell脚本基本结构

bash 复制代码
#!/bin/bash
# 这是一个注释
# 脚本说明:自动化批处理脚本示例

# 脚本主体代码
echo "Hello, World!"

1.2 创建和执行脚本

bash 复制代码
# 创建脚本文件
touch myscript.sh

# 添加执行权限
chmod +x myscript.sh

# 执行脚本
./myscript.sh
# 或
bash myscript.sh

二、Shell脚本核心语法

2.1 变量

bash 复制代码
#!/bin/bash
# 变量定义和使用
NAME="Linux User"
AGE=25
echo "Name: $NAME"
echo "Age: $AGE"

# 只读变量
readonly PI=3.14

# 环境变量
echo "PATH: $PATH"
echo "HOME: $HOME"

# 特殊变量
echo "脚本名: $0"
echo "参数1: $1"
echo "参数个数: $#"
echo "所有参数: $@"
echo "退出状态: $?"

2.2 输入输出

bash 复制代码
#!/bin/bash
# 标准输出
echo "This is output"

# 格式化输出
printf "Name: %s, Age: %d\n" "John" 25

# 读取输入
echo "请输入您的名字:"
read username
echo "你好, $username"

# 从文件读取
while read line; do
    echo "行内容: $line"
done < input.txt

三、流程控制

3.1 条件判断

bash 复制代码
#!/bin/bash
# if-else语句
if [ "$1" -gt 10 ]; then
    echo "大于10"
elif [ "$1" -eq 10 ]; then
    echo "等于10"
else
    echo "小于10"
fi

# case语句
case $1 in
    start)
        echo "启动服务"
        ;;
    stop)
        echo "停止服务"
        ;;
    restart)
        echo "重启服务"
        ;;
    *)
        echo "用法: $0 {start|stop|restart}"
        ;;
esac

3.2 循环结构

bash 复制代码
#!/bin/bash
# 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循环
num=1
until [ $num -gt 5 ]; do
    echo "直到计数: $num"
    ((num++))
done

四、常用命令

4.1 文件和目录操作

bash 复制代码
# 创建目录
mkdir -p /path/to/directory

# 复制文件
cp source.txt destination.txt
cp -r source_dir/ dest_dir/  # 递归复制目录

# 移动/重命名
mv old.txt new.txt
mv file.txt /path/to/destination/

# 删除
rm filename.txt
rm -rf directory/  # 强制递归删除

# 查看文件
cat file.txt
less file.txt
head -n 10 file.txt
tail -n 20 file.txt
tail -f logfile.log  # 实时查看日志

# 查找文件
find /path -name "*.txt"
find . -type f -size +10M

4.2 文本处理

bash 复制代码
# grep搜索
grep "pattern" file.txt
grep -r "pattern" directory/  # 递归搜索
grep -i "pattern" file.txt    # 忽略大小写
grep -v "pattern" file.txt    # 反向匹配

# sed流编辑器
sed 's/old/new/g' file.txt            # 替换
sed '/pattern/d' file.txt             # 删除匹配行
sed -n '10,20p' file.txt              # 打印10-20行

# awk文本分析
awk '{print $1}' file.txt             # 打印第一列
awk -F',' '{print $2}' file.csv       # 指定分隔符
awk '$3 > 100 {print $0}' data.txt    # 条件筛选

4.3 系统管理

bash 复制代码
# 进程管理
ps aux | grep process_name
top -u username
kill -9 PID
pkill process_name

# 磁盘空间
df -h
du -sh directory/
du -h --max-depth=1

# 系统信息
uname -a
cat /etc/os-release
free -h
uptime

# 用户管理
whoami
id username
last

五、实用脚本示例

5.1 备份脚本

bash 复制代码
#!/bin/bash
# 备份脚本
BACKUP_DIR="/backup"
SOURCE_DIR="/data"
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="backup_$DATE.tar.gz"

echo "开始备份..."
tar -czf "$BACKUP_DIR/$BACKUP_FILE" "$SOURCE_DIR"

if [ $? -eq 0 ]; then
    echo "备份成功: $BACKUP_FILE"
    
    # 删除7天前的备份
    find $BACKUP_DIR -name "backup_*.tar.gz" -mtime +7 -delete
else
    echo "备份失败"
    exit 1
fi

5.2 日志监控脚本

bash 复制代码
#!/bin/bash
# 监控日志错误
LOG_FILE="/var/log/app.log"
ERROR_KEYWORDS=("ERROR" "CRITICAL" "FAILED")
ALERT_EMAIL="admin@example.com"

check_errors() {
    for keyword in "${ERROR_KEYWORDS[@]}"; do
        count=$(grep -c "$keyword" "$LOG_FILE")
        if [ $count -gt 0 ]; then
            echo "发现 $count 个 $keyword 错误" | mail -s "系统警报" "$ALERT_EMAIL"
            # 提取错误详情
            grep "$keyword" "$LOG_FILE" | tail -5 > /tmp/last_errors.txt
        fi
    done
}

# 定期检查
while true; do
    check_errors
    sleep 300  # 5分钟检查一次
done

5.3 批量文件处理

bash 复制代码
#!/bin/bash
# 批量重命名和转换
INPUT_DIR="./images"
OUTPUT_DIR="./converted"

mkdir -p "$OUTPUT_DIR"

for img in "$INPUT_DIR"/*.jpg; do
    if [ -f "$img" ]; then
        filename=$(basename "$img" .jpg)
        # 转换并调整大小
        convert "$img" -resize 800x600 "$OUTPUT_DIR/${filename}_resized.jpg"
        echo "已处理: $filename"
    fi
done

echo "批量处理完成"

六、脚本调试和优化

6.1 调试技巧

bash 复制代码
#!/bin/bash
# 调试选项
set -x   # 显示执行的命令
set -e   # 遇到错误立即退出
set -u   # 使用未定义变量时报错

# 或执行时启用
bash -x script.sh

6.2 错误处理

bash 复制代码
#!/bin/bash
# 错误处理示例
cleanup() {
    echo "清理临时文件..."
    rm -f /tmp/temp_*
    echo "脚本退出"
}

# 捕获退出信号
trap cleanup EXIT

# 函数错误处理
process_file() {
    local file=$1
    if [ ! -f "$file" ]; then
        echo "错误: 文件不存在 - $file" >&2
        return 1
    fi
    # 处理逻辑
}

# 主程序
main() {
    process_file "$1" || exit 1
    # 其他逻辑
}

七、最佳实践

  1. 添加文档头

    bash 复制代码
    #!/bin/bash
    # 脚本名称: backup.sh
    # 作者: Your Name
    # 版本: 1.0
    # 描述: 用于系统备份
    # 用法: ./backup.sh [选项]
  2. 使用函数模块化

  3. 添加日志记录

  4. 参数验证

  5. 添加帮助功能

  6. 使用配置文件

  7. 定期维护和更新

八、学习资源推荐

  1. 官方文档: GNU Bash手册
  2. 在线教程 :
    • Linux Shell Scripting Tutorial
    • Bash Academy
  3. 参考书籍 :
    • 《Linux命令行与shell脚本编程大全》
    • 《Bash Cookbook》

通过掌握这些基础知识和常用命令,你可以编写出功能强大、稳定可靠的自动化批处理脚本,大大提高Linux系统管理效率。

相关推荐
代码总长两年半2 小时前
Linux---配置编程环境VSCode
linux·运维·服务器
Tipriest_2 小时前
Linux 桌面(Desktop)图标的生成原理/执行流程/自己编写桌面图标的方法
linux·运维·服务器
G_H_S_3_2 小时前
【网络运维】KVM基础使用
linux·运维·网络·kvm
gis分享者2 小时前
请编写一个 Bash 脚本检查系统中的所有服务状态(中等)
bash·shell·服务·状态·检查·所有
Lynnxiaowen2 小时前
今天我们利用Jenkins插件调用ansible
linux·运维·ansible·jenkins
_OP_CHEN2 小时前
【Linux系统编程】(十七)揭秘 Linux 进程创建与终止:从 fork 到 exit 的底层逻辑全解析
linux·运维·服务器·操作系统·shell·进程·进程创建与终止
草莓熊Lotso2 小时前
Makefile 完全指南:从入门到工程化,自动化构建不再难
linux·运维·服务器·人工智能·经验分享·后端·自动化
代码游侠2 小时前
学习笔记——网络基础
linux·c语言·网络·笔记·学习·算法
ElfBoard3 小时前
ElfBoard技术贴|如何在【RK3588】ELF 2开发板实现GPIO功能复用
linux·人工智能·单片机·嵌入式硬件·物联网·机器人