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
相关推荐
qdprobot2 分钟前
开源的在线串口调试助手支持macOS苹果电脑Windows系统Linux 浏览器webSerial
linux·运维·服务器·人工智能·mixly·小智ai·webserial
wdfk_prog8 分钟前
[Linux]学习笔记系列 -- [fs]namespace
linux·笔记·学习
无限大.22 分钟前
为什么“DevOps“能提高软件开发效率?——从开发到运维的融合
linux·运维·devops
饭九钦vlog23 分钟前
dns形式的floodddos命令
linux·运维·服务器
mengml_smile23 分钟前
众包运维调研
运维
gaize121330 分钟前
服务器异常的处理方法
服务器
雪碧聊技术31 分钟前
centos7如何安装redis?
linux·centos·安装redis
Anthony_23138 分钟前
MySql常用SQL命令
服务器·数据库·sql·mysql·http·oracle·udp
旖旎夜光39 分钟前
linux(8)(下)
linux·学习
树码小子1 小时前
网络原理(13):TCP协议十大核心机制 -- 确认应答 & 超时重传
服务器·网络·tcp/ip