如何用Shell Script的wget下载公开GitHub仓库指定版本二进制包并移至本地目录
没问题!这是个很常见的需求,我给你整理了一套实用的shell脚本实现方案,附带详细说明:
完整实现脚本
#!/bin/bash # 配置参数,请根据你的实际需求修改 REPO_OWNER="your-github-username" REPO_NAME="your-repo-name" RELEASE_TAG="v1.0.0" # 对应GitHub上的release版本标签,比如v2.3.4 BINARY_NAME="app-linux-amd64" # 要下载的二进制文件名,必须和release页面的文件名完全匹配 TARGET_DIR="/usr/local/bin" # 最终要存放文件的本地目录 # 构造GitHub release文件的下载URL DOWNLOAD_URL="https://github.com/${REPO_OWNER}/${REPO_NAME}/releases/download/${RELEASE_TAG}/${BINARY_NAME}" # 检查目标目录是否存在,不存在则自动创建 if [ ! -d "${TARGET_DIR}" ]; then echo "目标目录 ${TARGET_DIR} 不存在,正在创建..." mkdir -p "${TARGET_DIR}" fi # 开始下载文件,-O指定保存文件名,去掉-q可以显示下载进度 echo "开始下载 ${BINARY_NAME} (版本 ${RELEASE_TAG})..." wget -q -O "${BINARY_NAME}" "${DOWNLOAD_URL}" # 判断下载是否成功 if [ $? -eq 0 ]; then # 移动文件到目标目录,若目标是系统目录(如/usr/local/bin),可能需要加sudo echo "下载成功,正在移动到 ${TARGET_DIR}..." mv "${BINARY_NAME}" "${TARGET_DIR}/" # 可选:给二进制文件添加执行权限,方便直接运行 chmod +x "${TARGET_DIR}/${BINARY_NAME}" echo "操作完成!文件已保存至 ${TARGET_DIR}/${BINARY_NAME}" else echo "下载失败,请检查URL、网络连接或参数配置是否正确" exit 1 fi
关键步骤详解
1. 配置核心参数
先定义几个变量,让脚本更易维护:
REPO_OWNER:GitHub仓库的所有者(用户名或组织名)REPO_NAME:仓库的名称RELEASE_TAG:你要下载的release版本标签(必须和GitHub上的标签完全一致,比如v1.2.3)BINARY_NAME:release页面里提供的二进制文件名(注意大小写、后缀都要匹配,比如app-darwin-arm64、app-windows.exe)TARGET_DIR:文件最终要移动到的本地目录(比如/usr/local/bin可以让你直接在终端调用该程序)
2. 构造下载URL
GitHub的release文件下载地址是固定格式的:https://github.com/<所有者>/<仓库>/releases/download/<版本标签>/<文件名>,用变量拼接可以让脚本适配不同的仓库和版本。
3. 预处理目标目录
用mkdir -p可以递归创建目录,即使父目录不存在也能成功,避免因为目录缺失导致后续移动操作失败。
4. 下载与校验
wget的-O参数用来指定下载后保存的文件名;-q是静默模式,去掉它就能看到实时下载进度- 下载完成后,通过
$?判断wget的执行状态(返回0表示成功,非0则是失败)
5. 后续处理
- 用
mv命令将文件移动到目标目录,如果目标是系统级目录(比如/usr/local/bin),可能需要在mv前加上sudo获取权限 - 下载的二进制包默认可能没有执行权限,所以用
chmod +x添加可执行权限,这样你直接输入文件名就能运行程序了
特殊情况处理
如果release里的文件是压缩包(比如.tar.gz或.zip),你需要先解压再移动,举个例子:
# 假设下载的是tar.gz压缩包 wget -q -O "${BINARY_NAME}.tar.gz" "${DOWNLOAD_URL}" tar -xzf "${BINARY_NAME}.tar.gz" # 解压压缩包 mv "${BINARY_NAME}" "${TARGET_DIR}/" # 移动解压后的二进制文件 rm "${BINARY_NAME}.tar.gz" # 可选:删除临时压缩包
另外,如果你的网络访问GitHub有问题,可以在脚本开头添加代理配置:
export https_proxy=http://your-proxy-address:port
内容的提问来源于stack exchange,提问作者Bhranee




