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



所有评论(0)