Git 基本操作

第一个Shell脚本

从零开始学习Shell脚本编程

掌握自动化任务的基础技能

什么是Shell脚本?

Shell脚本是一种为Shell编写的脚本程序,它可以将一系列Shell命令组合在一个文件中,实现自动化执行。Shell脚本通常用于:

自动化任务

批量处理文件、定期备份、系统监控等重复性工作。

系统管理

用户管理、软件安装、服务配置等系统管理任务。

开发工具

构建流程、测试自动化、部署脚本等开发相关任务。

为什么学习Shell脚本?

Shell脚本是Linux/Unix系统管理员和开发者的核心技能。掌握Shell脚本可以大大提高工作效率,实现复杂任务的自动化处理。

创建第一个Shell脚本

让我们从经典的"Hello World"开始,创建并运行你的第一个Shell脚本。

1 创建脚本文件

使用文本编辑器创建一个新文件,命名为 hello.sh

Terminal
# 使用nano创建文件
nano hello.sh

# 或使用vim
vim hello.sh

# 或使用其他文本编辑器

2 编写脚本内容

在文件中输入以下内容:

hello.sh
#!/bin/bash
# 这是我的第一个Shell脚本
echo "Hello, World!"
代码解释:
  • #!/bin/bash - 指定使用Bash解释器执行此脚本
  • # 这是我的第一个Shell脚本 - 注释,以#开头,不会被执行
  • echo "Hello, World!" - 输出文本到终端

3 赋予执行权限

在运行脚本之前,需要先赋予它执行权限。

Terminal
chmod +x hello.sh
权限说明:

chmod +x 命令为文件添加执行权限。在Linux/Unix系统中,只有具有执行权限的文件才能作为程序运行。

4 运行脚本

现在可以运行你的第一个Shell脚本了!

Terminal
# 方法1:使用相对路径
./hello.sh

# 方法2:使用绝对路径
/home/username/hello.sh

# 方法3:使用bash命令(不需要执行权限)
bash hello.sh
恭喜!

如果一切正常,你将在终端看到输出:Hello, World!。你已经成功创建并运行了第一个Shell脚本!

Shell脚本基础语法

掌握Shell脚本的基本语法元素,为编写更复杂的脚本打下基础。

变量

在Shell脚本中,变量用于存储数据。变量名区分大小写,通常使用大写字母。

variables.sh
#!/bin/bash

# 定义变量(注意:等号两边不能有空格)
NAME="Alice"
AGE=25

# 使用变量(使用$符号引用变量)
echo "My name is $NAME"
echo "I am $AGE years old"

# 另一种引用变量的方式
echo "My name is ${NAME}"

# 只读变量(不能被修改)
readonly COUNTRY="China"
echo "I am from $COUNTRY"

# 删除变量(不能删除只读变量)
unset AGE

用户输入

Shell脚本可以接收用户输入,使脚本更加交互式。

input.sh
#!/bin/bash

# 使用read命令获取用户输入
echo "What is your name?"
read NAME

echo "How old are you?"
read AGE

echo "Hello $NAME, you are $AGE years old!"

# 在一行中获取多个输入
echo "Enter your full name:"
read FIRST_NAME LAST_NAME
echo "Your first name is $FIRST_NAME"
echo "Your last name is $LAST_NAME"

# 静默输入(用于密码)
echo "Enter your password:"
read -s PASSWORD
echo "Password accepted!"

# 带提示的输入
read -p "Enter your email: " EMAIL
echo "Your email is $EMAIL"

条件判断

使用条件语句可以根据不同情况执行不同的代码。

conditions.sh
#!/bin/bash

# 基本的if语句
echo "Enter a number:"
read NUM

if [ $NUM -gt 10 ]; then
    echo "The number is greater than 10"
fi

# if-else语句
if [ $NUM -eq 10 ]; then
    echo "The number is equal to 10"
else
    echo "The number is not equal to 10"
fi

# if-elif-else语句
if [ $NUM -lt 10 ]; then
    echo "The number is less than 10"
elif [ $NUM -eq 10 ]; then
    echo "The number is equal to 10"
else
    echo "The number is greater than 10"
fi

# 字符串比较
echo "Enter your name:"
read NAME

if [ "$NAME" = "Alice" ]; then
    echo "Hello, Alice!"
elif [ "$NAME" = "Bob" ]; then
    echo "Hello, Bob!"
else
    echo "Hello, stranger!"
fi

循环

循环允许你重复执行一段代码多次。

loops.sh
#!/bin/bash

# for循环
echo "Counting from 1 to 5:"
for i in 1 2 3 4 5; do
    echo "Number: $i"
done

# for循环使用序列
echo "Counting from 1 to 5 using sequence:"
for i in {1..5}; do
    echo "Number: $i"
done

# while循环
echo "Counting from 1 to 5 using while loop:"
COUNT=1
while [ $COUNT -le 5 ]; do
    echo "Number: $COUNT"
    COUNT=$((COUNT + 1))
done

# 无限循环(按Ctrl+C退出)
# while true; do
#     echo "This will run forever"
#     sleep 1
# done

# 循环处理文件
echo "Listing all .txt files:"
for FILE in *.txt; do
    echo "Found file: $FILE"
done

实用脚本示例

通过实际例子加深对Shell脚本的理解和应用。

系统信息脚本

一个显示系统基本信息的实用脚本。

system_info.sh
#!/bin/bash

# 系统信息脚本

echo "===== 系统信息 ====="
echo "主机名: $(hostname)"
echo "操作系统: $(uname -s)"
echo "内核版本: $(uname -r)"
echo "系统架构: $(uname -m)"

echo -e "\n===== 用户信息 ====="
echo "当前用户: $(whoami)"
echo "用户家目录: $HOME"

echo -e "\n===== 磁盘使用情况 ====="
df -h | grep -v tmpfs

echo -e "\n===== 内存使用情况 ====="
free -h

echo -e "\n===== 当前时间 ====="
date

文件备份脚本

一个简单的文件备份脚本,可以备份指定目录。

backup.sh
#!/bin/bash

# 文件备份脚本

# 设置备份目录和源目录
BACKUP_DIR="/home/$(whoami)/backups"
SOURCE_DIR="/home/$(whoami)/documents"

# 创建备份目录(如果不存在)
mkdir -p $BACKUP_DIR

# 生成备份文件名(包含日期时间)
BACKUP_FILE="backup_$(date +%Y%m%d_%H%M%S).tar.gz"

echo "开始备份..."
echo "源目录: $SOURCE_DIR"
echo "备份文件: $BACKUP_DIR/$BACKUP_FILE"

# 创建备份
tar -czf $BACKUP_DIR/$BACKUP_FILE $SOURCE_DIR

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

用户管理脚本

一个简单的用户管理脚本,可以添加、删除和列出用户。

user_manager.sh
#!/bin/bash

# 用户管理脚本

# 检查是否以root权限运行
if [ "$(id -u)" != "0" ]; then
    echo "此脚本需要root权限。请使用sudo运行。"
    exit 1
fi

# 显示菜单
echo "用户管理脚本"
echo "1. 添加用户"
echo "2. 删除用户"
echo "3. 列出用户"
echo "4. 退出"

# 获取用户选择
read -p "请选择操作 [1-4]: " CHOICE

case $CHOICE in
    1)
        # 添加用户
        read -p "输入用户名: " USERNAME
        read -s -p "输入密码: " PASSWORD
        echo
        useradd -m $USERNAME
        echo "$USERNAME:$PASSWORD" | chpasswd
        echo "用户 $USERNAME 已添加"
        ;;
    2)
        # 删除用户
        read -p "输入要删除的用户名: " USERNAME
        userdel -r $USERNAME
        echo "用户 $USERNAME 已删除"
        ;;
    3)
        # 列出用户
        echo "系统用户:"
        cut -d: -f1 /etc/passwd | sort
        ;;
    4)
        # 退出
        echo "再见!"
        exit 0
        ;;
    *)
        echo "无效选择!"
        exit 1
        ;;
esac
注意:

用户管理脚本需要root权限才能运行。在生产环境中使用此类脚本时要格外小心。

下一步学习建议

进阶主题
  • 函数定义和使用
  • 错误处理和调试
  • 信号处理
  • 正则表达式
  • awk和sed文本处理
  • 脚本参数处理
实用技巧
  • 使用shebang指定解释器
  • 添加脚本注释和文档
  • 脚本调试技巧
  • 性能优化
  • 安全性最佳实践
  • 跨平台兼容性

推荐学习资源

实用工具
  • ShellCheck - Shell脚本静态分析工具
  • Bats - Bash自动化测试系统
  • shUnit2 - Shell脚本单元测试框架