Skip to content

项目4:简单Shell脚本入门

Shell脚本基础

Shell脚本是一种用于自动化执行命令的脚本语言,它可以帮助我们简化重复的任务,提高工作效率。

什么是Shell?

Shell是一个命令解释器,它是用户与Linux系统之间的接口。常见的Shell有:

  • bash:Bourne Again Shell,最常用的Shell
  • sh:Bourne Shell,早期的Shell
  • csh:C Shell,语法类似C语言
  • zsh:Z Shell,功能更强大的Shell

Shell脚本的基本结构

一个基本的Shell脚本包含以下部分:

  1. Shebang行:指定脚本使用的Shell
  2. 注释:说明脚本的功能和使用方法
  3. 命令:要执行的命令
  4. 变量:存储数据
  5. 控制结构:条件判断、循环等
  6. 函数:封装可重用的代码

创建第一个Shell脚本

  1. 创建脚本文件:
bash
nano hello.sh
  1. 添加以下内容:
bash
#!/bin/bash

# 这是一个简单的Shell脚本
echo "Hello, World!"
echo "当前目录:$(pwd)"
echo "当前用户:$(whoami)"
  1. 添加执行权限:
bash
chmod +x hello.sh
  1. 运行脚本:
bash
./hello.sh

变量

定义变量

bash
# 定义变量
name="John"
age=25

# 引用变量
echo "Name: $name"
echo "Age: $age"

# 命令替换
current_date=$(date +%Y-%m-%d)
echo "Current date: $current_date"

环境变量

bash
# 查看环境变量
env

# 设置环境变量
export PATH=$PATH:/home/user/bin

# 查看特定环境变量
echo $PATH
echo $HOME
echo $USER

控制结构

条件判断

bash
#!/bin/bash

read -p "请输入一个数字:" num

if [ $num -gt 0 ]; then
    echo "这是一个正数"
elif [ $num -lt 0 ]; then
    echo "这是一个负数"
else
    echo "这是零"
fi

循环

bash
#!/bin/bash

# for循环
echo "For循环示例:"
for i in 1 2 3 4 5; do
    echo "数字:$i"
done

# while循环
echo "\nWhile循环示例:"
i=1
while [ $i -le 5 ]; do
    echo "数字:$i"
    i=$((i+1))
done

编写脚本:自动备份文件、批量创建用户

自动备份文件脚本

创建一个名为 auto_backup.sh 的脚本:

bash
#!/bin/bash

# 自动备份文件脚本

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

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

# 执行备份
echo "开始备份..."
tar -czvf $BACKUP_FILE $SOURCE_DIR
echo "备份完成:$BACKUP_FILE"

# 清理旧备份(保留最近7天的)
echo "清理旧备份..."
find $BACKUP_DIR -name "backup_*.tar.gz" -mtime +7 -delete
echo "清理完成"

# 显示备份信息
echo "\n备份信息:"
echo "源目录:$SOURCE_DIR"
echo "备份目录:$BACKUP_DIR"
echo "备份文件:$BACKUP_FILE"
echo "备份大小:$(du -h $BACKUP_FILE | cut -f1)"

使用方法:

bash
chmod +x auto_backup.sh
./auto_backup.sh

批量创建用户脚本

创建一个名为 create_users.sh 的脚本:

bash
#!/bin/bash

# 批量创建用户脚本

# 检查是否以root身份运行
if [ $EUID -ne 0 ]; then
    echo "错误:请以root身份运行此脚本"
    exit 1
fi

# 定义用户列表
USERS=("user1" "user2" "user3" "user4" "user5")

# 批量创建用户
for user in "${USERS[@]}"; do
    # 检查用户是否存在
    if id "$user" &>/dev/null; then
        echo "用户 $user 已存在"
    else
        # 创建用户
        useradd -m $user
        # 设置默认密码
        echo "$user:password123" | chpasswd
        # 强制用户首次登录修改密码
        passwd -e $user
        echo "用户 $user 创建成功"
    fi
done

# 显示创建结果
echo "\n用户创建完成,当前用户列表:"
cut -d: -f1 /etc/passwd | grep -E "user[1-5]"

使用方法:

bash
chmod +x create_users.sh
sudo ./create_users.sh

脚本权限配置与运行测试

脚本权限配置

Shell脚本需要执行权限才能运行,我们可以使用 chmod 命令来设置权限:

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

# 查看权限
ls -la script.sh

# 移除执行权限
chmod -x script.sh

运行脚本的方式

  1. 直接运行
bash
./script.sh
  1. 使用bash命令运行
bash
bash script.sh
  1. 使用sh命令运行
bash
sh script.sh
  1. 将脚本添加到PATH
bash
# 将脚本复制到/usr/local/bin
sudo cp script.sh /usr/local/bin/

# 直接运行脚本
script.sh

脚本测试

1. 语法检查

使用 bash -n 命令检查脚本语法:

bash
bash -n script.sh

2. 调试脚本

使用 bash -x 命令调试脚本:

bash
bash -x script.sh

3. 测试脚本功能

创建测试环境并运行脚本,验证其功能是否正常:

bash
# 创建测试目录
mkdir -p test_dir

# 创建测试文件
echo "test content" > test_dir/file1.txt
echo "test content" > test_dir/file2.txt

# 运行备份脚本
./auto_backup.sh

# 检查备份文件
ls -la /backup/

脚本最佳实践

  1. 添加注释:说明脚本的功能、参数和使用方法
  2. 使用变量:提高脚本的可维护性
  3. 错误处理:添加错误检查和处理机制
  4. 日志记录:记录脚本的执行过程和结果
  5. 安全性:避免使用硬编码的密码和敏感信息
  6. 可移植性:使用标准Shell语法,避免使用特定Shell的特性
  7. 模块化:将复杂的功能封装为函数

示例:带日志和错误处理的脚本

bash
#!/bin/bash

# 带日志和错误处理的脚本

# 设置日志文件
LOG_FILE="/var/log/my_script.log"

# 日志函数
log() {
    echo "[$(date +%Y-%m-%d %H:%M:%S)] $1" >> $LOG_FILE
    echo "$1"
}

# 错误处理函数
error_exit() {
    log "错误:$1"
    exit 1
}

# 检查依赖命令
check_dependencies() {
    log "检查依赖命令..."
    for cmd in tar gzip find; do
        if ! command -v $cmd &>/dev/null; then
            error_exit "缺少命令:$cmd"
        fi
    done
    log "依赖检查完成"
}

# 主函数
main() {
    log "开始执行脚本"
    
    # 检查依赖
    check_dependencies
    
    # 执行任务
    log "执行备份任务..."
    # 这里添加具体的备份命令
    
    log "脚本执行完成"
}

# 运行主函数
main

通过以上步骤,我们学习了Shell脚本的基础知识,编写了自动备份文件和批量创建用户的脚本,并学习了脚本权限配置和运行测试的方法。这些技能对于自动化Linux系统管理任务非常重要。

© 2026 编程马·菜鸟教程 版权所有