Linux Shell脚本的编写方法

一、基础概念

1. 创建脚本

复制代码
#!/bin/bash
# 第一行必须是shebang,指定解释器
# 这是一个简单的shell脚本

2. 脚本结构示例

复制代码
#!/bin/bash
# 脚本说明
# 作者:xxx
# 日期:2024-01-01

# 定义变量
name="World"
count=10

# 主程序
echo "Hello, $name!"
echo "当前时间: $(date)"

二、基本语法

1. 变量

复制代码
# 定义变量
name="张三"
age=25
PATH="/usr/local/bin:$PATH"

# 使用变量
echo "姓名: $name"
echo "年龄: ${age}岁"

# 只读变量
readonly PI=3.14159

# 删除变量
unset name

2. 输入输出

复制代码
# 输出
echo "Hello World"
printf "姓名: %s\n" "$name"

# 输入
read -p "请输入姓名: " username
read -s -p "请输入密码: " password

3. 条件判断

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

# 条件判断符
# 数值比较: -eq, -ne, -gt, -lt, -ge, -le
# 字符串比较: =, !=, -z, -n
# 文件测试: -e, -f, -d, -r, -w, -x

4. 循环

复制代码
# 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循环
until [ $count -gt 5 ]; do
    echo "计数: $count"
    ((count++))
done

5. 函数

复制代码
# 定义函数
function say_hello() {
    local name=$1
    echo "Hello, $name!"
    return 0
}

# 调用函数
say_hello "World"

# 获取返回值
result=$?

三、实用示例

1. 系统信息脚本

复制代码
#!/bin/bash
# sysinfo.sh - 显示系统信息

echo "===== 系统信息 ====="
echo "主机名: $(hostname)"
echo "系统版本: $(cat /etc/os-release | grep PRETTY_NAME)"
echo "内核版本: $(uname -r)"
echo "CPU信息: $(lscpu | grep "Model name")"
echo "内存使用: $(free -h | awk '/^Mem:/ {print $3 "/" $2}')"
echo "磁盘空间:"
df -h / | awk 'NR==2 {print $3 "/" $2 " (" $5 ")"}'

2. 备份脚本

复制代码
#!/bin/bash
# backup.sh - 文件备份脚本

BACKUP_DIR="/backup"
SOURCE_DIR="/home/user/documents"
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="backup_$DATE.tar.gz"

# 创建备份目录
mkdir -p $BACKUP_DIR

# 执行备份
tar -czf "$BACKUP_DIR/$BACKUP_FILE" "$SOURCE_DIR"

# 检查是否成功
if [ $? -eq 0 ]; then
    echo "备份成功: $BACKUP_FILE"
    echo "备份大小: $(du -h $BACKUP_DIR/$BACKUP_FILE | cut -f1)"
else
    echo "备份失败!" >&2
    exit 1
fi

3. 监控脚本

复制代码
#!/bin/bash
# monitor.sh - 监控系统资源

LOG_FILE="/var/log/system_monitor.log"
THRESHOLD=80

check_disk() {
    usage=$(df / | awk 'NR==2 {print $5}' | sed 's/%//')
    if [ $usage -gt $THRESHOLD ]; then
        echo "$(date): 警告! 磁盘使用率: ${usage}%" >> $LOG_FILE
    fi
}

check_memory() {
    usage=$(free | awk '/^Mem:/ {printf("%.0f", $3/$2 * 100)}')
    if [ $usage -gt $THRESHOLD ]; then
        echo "$(date): 警告! 内存使用率: ${usage}%" >> $LOG_FILE
    fi
}

# 主循环
while true; do
    check_disk
    check_memory
    sleep 300  # 5分钟检查一次
done

四、调试技巧

复制代码
# 1. 执行时显示每一行
bash -x script.sh

# 2. 在脚本中启用调试
#!/bin/bash
set -x  # 开启调试
# 脚本内容
set +x  # 关闭调试

# 3. 详细调试
set -e  # 遇到错误立即退出
set -u  # 使用未定义变量时报错
set -o pipefail  # 管道中任何错误都视为失败

五、最佳实践

  1. 添加注释:说明脚本用途、参数、作者等

  2. 错误处理:检查命令执行结果

  3. 日志记录:重要操作记入日志

  4. 参数检查:验证输入参数

  5. 权限控制:使用适当权限运行

  6. 代码复用:将通用功能写成函数

  7. 配置文件:将配置与代码分离

  8. 版本控制:使用Git管理脚本

六、执行脚本

复制代码
# 1. 添加执行权限
chmod +x script.sh

# 2. 执行脚本
./script.sh
bash script.sh
source script.sh  # 在当前shell执行

# 3. 带参数执行
./script.sh arg1 arg2
相关推荐
天疆说7 分钟前
04 稳定性与性能调优实录:OOM 崩溃、并发槽位、前缀缓存与 DSpark 调参
linux·运维·缓存
微硬创新7 分钟前
大点数模拟量采集落地:耐达讯自动化32路0-20mA适配PROFINET总线实践解析
运维·人工智能·网络协议·自动化·信息与通信
星卯教育tony8 分钟前
NOI Linux 2.0 服务器多用户网页桌面部署方案(腾讯云轻量Ubuntu20.04专属版 CSP复赛比赛环境搭建免安装虚拟机 )
linux·服务器·腾讯云
GIS数据转换器1 小时前
村镇无人机物流配送与跨域监测一体化平台
大数据·运维·人工智能·科技·无人机
Forever Nore1 小时前
LeetCode 14 最长公共前缀 - 纵向扫描
linux·服务器·leetcode
拂拉氏1 小时前
【知识讲解】 Linux权限相关知识讲解
linux·权限
倔强的石头1061 小时前
飞牛OS部署Mtab:Docker搭建自托管书签导航并实现远程访问
运维·docker·容器
Shadow(⊙o⊙)1 小时前
Linux网络部分——TCP协议服务端客户端交互接口,入门级硬核解析1.0
linux·网络·tcp/ip
小新讲网安1 小时前
HTTP请求走私攻击实战:CL.TE与TE.CL绕过前端服务器全解析
服务器·前端·网络·web安全·http·架构·漏洞
桑榆4166 小时前
双系统(Windows + Ubuntu)安装流程
linux·windows·ubuntu