一、Shell 脚本基础语法

1. Shell 脚本核心基础

1.1 执行方式

执行方式命令示例说明
直接执行./test.sh需给脚本添加执行权限(chmod +x test.sh),脚本首行需指定解释器(#!/bin/bash
解释器执行bash test.sh无需执行权限,直接调用 bash 解释器运行
导入执行source test.sh. test.sh在当前 Shell 环境执行(变量 / 函数可全局生效),常用于环境配置脚本

1.2 核心语法详解

(1)变量
#!/bin/bash
# 【Shell变量基础示例】
# 1. 普通变量定义(等号两侧无空格)
TEST_DIR="/opt/test_env"  # 测试环境根目录
PYTHON_VERSION="3.10.12"  # Python版本号

# 2. 命令替换(获取命令执行结果)
CURRENT_USER=$(whoami)     # 获取当前登录用户
SERVER_IP=$(ifconfig eth0 | grep "inet " | awk '{print $2}')  # 获取网卡eth0的IP

# 3. 变量引用($变量名 或 ${变量名},推荐后者避免歧义)
echo "测试环境目录:${TEST_DIR}"
echo "当前用户:${CURRENT_USER}"
echo "服务器IP:${SERVER_IP}"

# 4. 环境变量(全局生效)
export PATH="${TEST_DIR}/bin:$PATH"  # 将测试环境bin目录加入系统PATH
(2)条件判断
#!/bin/bash
# 【Shell条件判断示例(测试环境检查)】
TEST_DIR="/opt/test_env"
PYTHON_BIN="/usr/local/bin/python3.10"

# 1. 文件/目录判断
if [ -d "${TEST_DIR}" ]; then  # -d:判断是否为目录
    echo "✅ 测试环境目录 ${TEST_DIR} 已存在"
else
    echo "❌ 测试环境目录不存在,正在创建..."
    mkdir -p "${TEST_DIR}"  # -p:递归创建目录(父目录不存在则自动创建)
fi

# 2. 文件存在+可执行判断
if [ -x "${PYTHON_BIN}" ]; then  # -x:判断文件是否存在且可执行
    echo "✅ Python3.10 可执行文件存在"
else
    echo "❌ Python3.10 未安装或无执行权限"
    exit 1  # 退出脚本,返回非0表示执行失败
fi

# 3. 多条件判断(&&:且,||:或)
if [ "${CURRENT_USER}" = "root" ] && [ -w "/usr/local" ]; then  # -w:判断是否可写
    echo "✅ 当前用户为root,且/usr/local目录可写"
else
    echo "❌ 请使用root用户执行该脚本"
    exit 1
fi
(3)循环
#!/bin/bash
# 【Shell循环示例(批量操作测试环境)】
# 1. for循环(批量创建测试用户)
TEST_USERS=("test01" "test02" "test03")  # 测试用户列表
for user in "${TEST_USERS[@]}"; do  # 遍历数组
    id "${user}" &>/dev/null  # 检查用户是否存在(&>/dev/null:屏蔽输出)
    if [ $? -eq 0 ]; then  # $?:上一条命令的返回值(0=成功,非0=失败)
        echo "用户 ${user} 已存在,跳过创建"
    else
        useradd "${user}"  # 创建用户
        echo "test123" | passwd --stdin "${user}"  # 设置密码(免交互)
        echo "✅ 已创建测试用户:${user}"
    fi
done

# 2. while循环(检查服务是否启动)
SERVICE_NAME="nginx"  # 测试环境Nginx服务
COUNT=0
MAX_RETRY=5  # 最大重试次数
while [ ${COUNT} -lt ${MAX_RETRY} ]; do  # -lt:小于
    systemctl is-active "${SERVICE_NAME}" &>/dev/null
    if [ $? -eq 0 ]; then
        echo "✅ ${SERVICE_NAME} 服务已启动"
        break  # 退出循环
    else
        echo "⏳ 等待${SERVICE_NAME}启动...(第${COUNT}次重试)"
        sleep 2  # 休眠2秒
        COUNT=$((COUNT + 1))  # 计数+1
    fi
done

if [ ${COUNT} -eq ${MAX_RETRY} ]; then
    echo "❌ ${SERVICE_NAME} 服务启动失败"
    exit 1
fi
(4)函数
#!/bin/bash
# 【Shell函数示例(测试环境通用工具函数)】

# 1. 定义函数:检查端口是否占用
check_port() {
    local PORT=$1  # local:局部变量(仅函数内生效)
    local HOST=$2
    # 使用nc命令检查端口(-z:扫描端口,-w:超时时间)
    nc -z -w 3 "${HOST}" "${PORT}" &>/dev/null
    if [ $? -eq 0 ]; then
        echo "❌ 端口 ${HOST}:${PORT} 已被占用"
        return 1  # 函数返回失败
    else
        echo "✅ 端口 ${HOST}:${PORT} 未被占用"
        return 0  # 函数返回成功
    fi
}

# 2. 定义函数:安装Python依赖
install_python_deps() {
    local REQUIREMENTS_FILE=$1
    if [ ! -f "${REQUIREMENTS_FILE}" ]; then  # -f:判断是否为普通文件
        echo "❌ 依赖文件 ${REQUIREMENTS_FILE} 不存在"
        return 1
    fi
    echo "📦 开始安装Python依赖..."
    pip3 install -r "${REQUIREMENTS_FILE}" -i https://pypi.tuna.tsinghua.edu.cn/simple
    if [ $? -eq 0 ]; then
        echo "✅ 依赖安装完成"
        return 0
    else
        echo "❌ 依赖安装失败"
        return 1
    fi
}

# 调用函数
check_port 8080 127.0.0.1
install_python_deps "/opt/test_env/requirements.txt"

1.3 测试常用 Shell 脚本模板

#!/bin/bash
# 【测试环境批量操作模板:批量执行远程命令】
# 脚本用途:批量在多台测试服务器执行指定命令
# 使用方式:./batch_execute.sh "要执行的命令" 服务器列表文件

set -e  # 脚本遇到错误(返回非0)立即退出
set -u  # 引用未定义变量时报错

# 检查参数
if [ $# -ne 2 ]; then  # $#:参数个数
    echo "❌ 使用方式错误!正确用法:$0 \"command\" server_list_file"
    echo "示例:$0 \"df -h\" /opt/server_list.txt"
    exit 1
fi

COMMAND=$1
SERVER_FILE=$2

# 检查服务器列表文件
if [ ! -f "${SERVER_FILE}" ]; then
    echo "❌ 服务器列表文件 ${SERVER_FILE} 不存在"
    exit 1
fi

# 遍历服务器列表执行命令
echo "📝 开始在以下服务器执行命令:${COMMAND}"
while read -r SERVER_IP; do  # read -r:读取行(忽略反斜杠)
    # 跳过空行和注释行
    if [[ -z "${SERVER_IP}" || "${SERVER_IP}" =~ ^# ]]; then
        continue
    fi
    echo -e "\n========== 服务器 ${SERVER_IP} =========="
    # 免密登录执行命令(需提前配置SSH免密)
    ssh -o ConnectTimeout=5 "${SERVER_IP}" "${COMMAND}"
    if [ $? -eq 0 ]; then
        echo "✅ ${SERVER_IP} 命令执行成功"
    else
        echo "❌ ${SERVER_IP} 命令执行失败"
    fi
done < "${SERVER_FILE}"

echo -e "\n📊 批量命令执行完成!"

2. Linux 下 Python 环境部署

2.1 前置准备(安装依赖)

# 1. 更新系统包(CentOS/RHEL)
yum update -y
# 安装编译Python所需的依赖
yum install -y gcc zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel libffi-devel

# Ubuntu/Debian系统替换为:
# apt update -y
# apt install -y build-essential zlib1g-dev libbz2-dev libssl-dev libncurses5-dev libsqlite3-dev libreadline-dev tk-dev libgdbm-dev libdb-dev libpcap-dev xz-utils libffi-dev

解释:Python 源码编译需要依赖这些库(如 openssl-devel 用于 SSL 支持,libffi-devel 用于扩展模块),缺失会导致安装后功能不全。

2.2 下载并编译 Python

# 1. 创建下载目录
mkdir -p /opt/python_install && cd /opt/python_install

# 2. 下载Python3.10.12(可替换为其他版本)
wget https://www.python.org/ftp/python/3.10.12/Python-3.10.12.tgz
# 若wget下载慢,可换国内源:https://mirrors.tuna.tsinghua.edu.cn/python/3.10.12/Python-3.10.12.tgz

# 3. 解压
tar -zxvf Python-3.10.12.tgz && cd Python-3.10.12

# 4. 配置编译参数(关键)
./configure --prefix=/usr/local/python3.10 \  # 指定安装目录
            --enable-optimizations \          # 开启优化(提升Python运行速度)
            --with-ssl                        # 强制链接系统SSL库(解决pip报错)

# 5. 编译并安装(-j:指定CPU核心数,加速编译)
make -j $(nproc) && make install

解释

  • --prefix:指定安装路径,避免覆盖系统默认 Python(系统默认 Python 可能被系统工具依赖,不可修改);
  • --enable-optimizations:通过编译优化提升 Python 性能;
  • make -j $(nproc)$(nproc)自动获取 CPU 核心数,加速编译过程。

2.3 配置软链接(全局调用)

# 1. 创建python3和pip3软链接(替换系统默认版本)
ln -s /usr/local/python3.10/bin/python3.10 /usr/bin/python3
ln -s /usr/local/python3.10/bin/pip3.10 /usr/bin/pip3

# 2. 验证软链接
ls -l /usr/bin/python3 /usr/bin/pip3
# 输出示例:lrwxrwxrwx 1 root root 30 Mar  8 10:00 /usr/bin/python3 -> /usr/local/python3.10/bin/python3.10

# 3. 检查Python版本
python3 --version  # 输出:Python 3.10.12
pip3 --version     # 输出:pip 22.2.2 from /usr/local/python3.10/lib/python3.10/site-packages/pip (python 3.10)

解释:软链接相当于 Windows 的 “快捷方式”,将 Python3.10 的可执行文件链接到/usr/bin(系统默认 PATH 路径),实现全局调用python3/pip3

2.4 配置 pip 国内源(加速包安装)

# 1. 创建pip配置目录(当前用户)
mkdir -p ~/.pip

# 2. 写入清华源配置
cat > ~/.pip/pip.conf << EOF
[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
[install]
trusted-host = pypi.tuna.tsinghua.edu.cn
EOF

# 3. 系统级配置(所有用户生效)
mkdir -p /etc/pip
cat > /etc/pip/pip.conf << EOF
[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
[install]
trusted-host = pypi.tuna.tsinghua.edu.cn
EOF

# 验证:安装一个包测试
pip3 install requests

解释:国内源(清华 / 阿里 / 豆瓣)比官方源快,trusted-host解决 HTTPS 证书验证问题。

2.5 环境验证脚本(Python)

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Python环境验证脚本
功能:检查Python版本、pip源、第三方包安装是否正常
"""
import sys
import platform
import requests

def check_python_version():
    """检查Python版本是否符合要求(3.10+)"""
    version = sys.version_info
    if version >= (3, 10):
        print(f"✅ Python版本符合要求:{sys.version}")
        return True
    else:
        print(f"❌ Python版本过低,当前:{sys.version},要求3.10+")
        return False

def check_pip_source():
    """检查pip源是否为国内源"""
    import configparser
    import os
    # 优先读取用户级配置
    pip_conf = os.path.expanduser("~/.pip/pip.conf")
    if not os.path.exists(pip_conf):
        pip_conf = "/etc/pip/pip.conf"
    if not os.path.exists(pip_conf):
        print("⚠️ 未找到pip配置文件,使用默认源")
        return False
    
    config = configparser.ConfigParser()
    config.read(pip_conf)
    if "index-url" in config["global"] and "tsinghua" in config["global"]["index-url"]:
        print("✅ pip源已配置为清华源")
        return True
    else:
        print("⚠️ pip源未配置为国内源")
        return False

def check_third_party_package():
    """检查第三方包是否能正常导入"""
    try:
        response = requests.get("https://www.baidu.com", timeout=5)
        if response.status_code == 200:
            print("✅ 第三方包(requests)导入并使用正常")
            return True
        else:
            print("❌ requests请求失败")
            return False
    except Exception as e:
        print(f"❌ 第三方包使用异常:{e}")
        return False

if __name__ == "__main__":
    print("===== Python环境验证开始 =====")
    # 检查系统信息
    print(f"系统信息:{platform.system()} {platform.release()}")
    # 执行所有检查
    checks = [
        check_python_version,
        check_pip_source,
        check_third_party_package
    ]
    results = [check() for check in checks]
    if all(results):
        print("===== Python环境验证通过 =====")
    else:
        print("===== Python环境验证失败 =====")
        sys.exit(1)

3. 简单自动化脚本(测试环境批量操作)

3.1 批量创建测试目录 + 文件

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
测试环境批量操作脚本
功能:为多个测试用例创建独立的目录和配置文件
"""
import os
import sys
import argparse

def create_test_env(base_dir, case_num, clear_old=False):
    """
    创建测试环境目录结构
    :param base_dir: 基础目录
    :param case_num: 测试用例数量
    :param clear_old: 是否清空旧目录
    """
    # 检查基础目录
    if os.path.exists(base_dir):
        if clear_old:
            print(f"🗑️ 清空旧测试目录:{base_dir}")
            # 递归删除目录(谨慎使用!)
            import shutil
            shutil.rmtree(base_dir)
        else:
            print(f"⚠️ 基础目录已存在,跳过创建:{base_dir}")
    else:
        os.makedirs(base_dir, exist_ok=True)
        print(f"✅ 创建基础目录:{base_dir}")
    
    # 批量创建测试用例目录
    for i in range(1, case_num + 1):
        case_dir = os.path.join(base_dir, f"test_case_{i:03d}")  # 03d:补零为3位(001/002)
        os.makedirs(case_dir, exist_ok=True)
        
        # 创建配置文件
        config_file = os.path.join(case_dir, "config.ini")
        with open(config_file, "w", encoding="utf-8") as f:
            f.write(f"""[test_config]
case_id = {i:03d}
case_name = test_case_{i:03d}
env = test
server_ip = 127.0.0.1
port = {8080 + i}
""")
        print(f"✅ 创建测试用例{i:03d}:{case_dir}")

if __name__ == "__main__":
    # 解析命令行参数
    parser = argparse.ArgumentParser(description="测试环境批量创建脚本")
    parser.add_argument("--base-dir", default="/opt/test_cases", help="测试用例基础目录")
    parser.add_argument("--case-num", type=int, default=10, help="测试用例数量")
    parser.add_argument("--clear-old", action="store_true", help="是否清空旧目录")
    args = parser.parse_args()
    
    # 执行创建
    try:
        create_test_env(args.base_dir, args.case_num, args.clear_old)
        print("\n🎉 测试环境创建完成!")
    except Exception as e:
        print(f"\n❌ 执行失败:{e}")
        sys.exit(1)

使用方式

# 创建10个测试用例目录(不清空旧目录)
python3 create_test_env.py --case-num 10

# 创建20个测试用例目录(清空旧目录)
python3 create_test_env.py --base-dir /opt/new_test_cases --case-num 20 --clear-old

3.2 批量检查测试服务状态

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
测试服务批量检查脚本
功能:检查多台服务器的指定端口/服务是否正常
"""
import socket
import subprocess
import time

def check_port(host, port, timeout=3):
    """
    检查端口是否可连接
    :param host: 主机IP/域名
    :param port: 端口号
    :param timeout: 超时时间(秒)
    :return: 成功返回True,失败返回False
    """
    try:
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        sock.settimeout(timeout)
        result = sock.connect_ex((host, port))  # 0=成功,非0=失败
        sock.close()
        return result == 0
    except Exception as e:
        print(f"⚠️ 检查{host}:{port}异常:{e}")
        return False

def check_service(server_list, port_list):
    """
    批量检查服务器端口
    :param server_list: 服务器列表
    :param port_list: 端口列表
    """
    print("===== 测试服务状态检查 =====")
    print(f"检查时间:{time.strftime('%Y-%m-%d %H:%M:%S')}")
    print("-" * 50)
    
    for server in server_list:
        print(f"服务器:{server}")
        for port in port_list:
            if check_port(server, port):
                print(f"  ✅ {port}端口:正常")
            else:
                print(f"  ❌ {port}端口:异常")
        print("-" * 50)

if __name__ == "__main__":
    # 测试服务器列表(可从文件读取)
    SERVER_LIST = ["127.0.0.1", "192.168.1.100", "192.168.1.101"]
    # 测试端口列表(对应不同测试服务)
    PORT_LIST = [8080, 8081, 8082, 9000]
    
    # 执行检查
    check_service(SERVER_LIST, PORT_LIST)

4. Linux 全模块复盘(Docker/K8s 前置基础)

核心模块关键知识点与 Docker/K8s 的关联
文件系统1. 目录结构(/etc//var//usr//opt/)2. 权限管理(chmod/chown/chgrp)3. 软链接 / 硬链接Docker 镜像基于 Linux 文件系统,K8s 挂载卷需理解目录权限
进程管理1. ps/top/pstree 查看进程2. kill/systemctl 管理进程3. 后台运行(&/nohup/screen)Docker 容器本质是单进程,K8s 管理 Pod(容器组)进程生命周期
网络配置1. IP / 子网 / 网关配置2. 端口监听(netstat/ss)3. 防火墙(iptables/firewalld)4. SSH 免密登录Docker 网络模式(桥接 / 宿主 / 容器),K8s Service/Ingress/NetworkPolicy
包管理1. YUM/APT 安装软件2. 源码编译安装3. RPM/DEB 包管理Docker 镜像构建(安装依赖),K8s 容器镜像打包
存储管理1. 磁盘挂载(mount/umount)2. 分区(fdisk)3. 卷(LVM)Docker 数据卷(Volume),K8s PV/PVC 存储持久化
环境变量1. export 设置环境变量2. /etc/profile/~/.bashrc 配置Docker run -e 传递环境变量,K8s ConfigMap/Secret 管理配置

二、总结

核心要点回顾

  1. Shell 脚本:掌握变量(普通 / 命令替换 / 环境变量)、条件判断(文件 / 多条件)、循环(for/while)、函数(局部变量 / 返回值),可编写批量操作测试环境的脚本(如批量执行命令、检查服务)。
  2. Python 环境部署:Linux 下通过源码编译安装(指定路径避免覆盖系统 Python),配置软链接实现全局调用,修改 pip 源加速包安装,通过验证脚本确认环境可用性。
  3. 自动化脚本:Python 可编写批量创建测试目录、检查服务状态的脚本,结合参数解析提升脚本灵活性,满足测试环境批量操作需求。
  4. Linux 复盘:重点掌握文件系统、进程、网络、存储、环境变量核心知识点,这些是 Docker/K8s 理解容器 / 集群运行机制的基础。
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐