如何使用Python动态修改bash脚本内dockerversion变量并完成版本更新
解决方案
首先安装依赖包:
pip install requests packaging
以下是修正后可直接运行的完整代码:
import requests import re import subprocess from packaging.version import parse # 拉取Vaultwarden最新发布版本 url = 'https://github.com/dani-garcia/vaultwarden/releases/latest' r = requests.get(url, allow_redirects=True) latest_version = r.url.split('/')[-1].lstrip('v') # 去掉版本号前可能带的v前缀,统一格式 # 读取本地bash脚本全部内容,匹配当前存储的版本 bash_file_path = 'vaultwarden-update' current_version = None file_content = [] with open(bash_file_path, 'r', encoding='utf-8') as f: for line in f: file_content.append(line) # 匹配dockerversion变量行 if line.strip().startswith('dockerversion='): current_version = re.sub(r'^dockerversion=', '', line.strip()).lstrip('v') # 校验版本读取结果 if not current_version: raise Exception("未在bash脚本中找到dockerversion变量") # 版本对比,仅当最新版本大于当前版本时执行更新 if parse(latest_version) > parse(current_version): # 遍历全部内容,仅替换dockerversion行的值 new_content = [] for line in file_content: if line.strip().startswith('dockerversion='): new_content.append(f"dockerversion={latest_version}\n") else: new_content.append(line) # 写入修改后的内容到原文件 with open(bash_file_path, 'w', encoding='utf-8') as f: f.writelines(new_content) # 执行bash更新脚本 subprocess.run(['bash', bash_file_path], check=True)
关键调整说明
- 去掉了硬编码的行号匹配逻辑,改用正则匹配
dockerversion=开头的行,无论bash脚本后续怎么修改结构,都能准确定位到要修改的变量,不会出错 - 引入专业的语义化版本解析工具做版本对比,避免直接字符串对比出现的
1.29.2 < 1.3.0这类逻辑错误 - 保留原脚本所有内容,仅修改
dockerversion变量的取值,其余内容完全不变 - 增加了版本读取校验逻辑,避免脚本找不到变量时报错无提示
- 新增了更新后的bash脚本自动执行逻辑,不需要手动再调用
注意事项
- 运行Python脚本的用户需要有
vaultwarden-update文件的读写权限,以及执行docker命令的权限 - 如果你的版本号习惯带
v前缀(比如v1.29.2),可以删掉代码中.lstrip('v')的逻辑即可适配
内容的提问来源于stack exchange,提问作者George
相关产品推荐
相关产品推荐

