Skip to content

Instantly share code, notes, and snippets.

@krisstibex
Created March 25, 2025 10:18
Show Gist options
  • Select an option

  • Save krisstibex/b7dcc11a389ea4882e76952d3153ab55 to your computer and use it in GitHub Desktop.

Select an option

Save krisstibex/b7dcc11a389ea4882e76952d3153ab55 to your computer and use it in GitHub Desktop.
#!/bin/bash
# 切换到脚本所在目录(仅本地运行时)
if [[ -z "$BASH_SOURCE" || "$BASH_SOURCE" == "$0" ]]; then
cd "$(dirname "$0")"
fi
# Minecraft 服务器下载 URL
MINECRAFT_VERSIONS_API="https://launchermeta.mojang.com/mc/game/version_manifest.json"
# 解析命令行参数
DOWNLOAD_DIR=""
while getopts "o:" opt; do
case ${opt} in
o ) DOWNLOAD_DIR="$OPTARG" ;;
* ) echo "用法: $0 [-o 下载目录]"; exit 1 ;;
esac
done
# 远程运行检测(即使用 bash <(curl -fsSL <URL>) 方式)
if [[ ! -t 0 && -z "$DOWNLOAD_DIR" ]]; then
echo "远程运行时必须使用 -o 参数指定下载目录!"
exit 1
fi
# 如果未指定目录,则使用当前目录
if [[ -z "$DOWNLOAD_DIR" ]]; then
DOWNLOAD_DIR="$(pwd)"
fi
mkdir -p "$DOWNLOAD_DIR"
# 读取版本信息
echo "正在获取 Minecraft 服务器版本列表..."
VERSIONS_JSON=$(curl -s "$MINECRAFT_VERSIONS_API")
# 解析版本列表
RELEASE_VERSIONS=($(echo "$VERSIONS_JSON" | jq -r '.versions[] | select(.type=="release") | .id'))
SNAPSHOT_VERSIONS=($(echo "$VERSIONS_JSON" | jq -r '.versions[] | select(.type=="snapshot") | .id'))
OLD_BETA_VERSIONS=($(echo "$VERSIONS_JSON" | jq -r '.versions[] | select(.type=="old_beta") | .id'))
OLD_ALPHA_VERSIONS=($(echo "$VERSIONS_JSON" | jq -r '.versions[] | select(.type=="old_alpha") | .id'))
ALL_VERSIONS=("${RELEASE_VERSIONS[@]}" "${SNAPSHOT_VERSIONS[@]}" "${OLD_BETA_VERSIONS[@]}" "${OLD_ALPHA_VERSIONS[@]}")
BETA_VERSIONS=("${SNAPSHOT_VERSIONS[@]}" "${OLD_BETA_VERSIONS[@]}")
ALPHA_VERSIONS=("${OLD_ALPHA_VERSIONS[@]}")
# 选择版本类型菜单
while true; do
echo -e "\n请选择 Minecraft 服务器版本类型:"
echo "1) 正式版(Release)"
echo "2) 测试版(Beta & Snapshot)"
echo "3) 远古版(Alpha)"
echo "4) 所有版本"
echo "0) 退出脚本"
read -p "输入选项(0-4): " VERSION_TYPE
case $VERSION_TYPE in
1) SELECTED_VERSIONS=("${RELEASE_VERSIONS[@]}");;
2) SELECTED_VERSIONS=("${BETA_VERSIONS[@]}");;
3) SELECTED_VERSIONS=("${ALPHA_VERSIONS[@]}");;
4) SELECTED_VERSIONS=("${ALL_VERSIONS[@]}");;
0) echo "已退出脚本。"; exit 0;;
*) echo "无效选项,请重新输入!"; continue;;
esac
# 版本选择菜单
while true; do
echo -e "\n可用的 Minecraft 服务器版本:"
for i in "${!SELECTED_VERSIONS[@]}"; do
echo "$(($i+1)). ${SELECTED_VERSIONS[$i]}"
done
echo -e "\n输入序号选择版本,或直接输入版本号"
echo "直接回车下载最新版本(${SELECTED_VERSIONS[0]})"
echo "输入 0 返回上级菜单"
read -p "请输入选择的版本: " USER_INPUT
# 处理用户输入
if [[ -z "$USER_INPUT" ]]; then
SELECTED_VERSION=${SELECTED_VERSIONS[0]}
elif [[ "$USER_INPUT" == "0" ]]; then
break
elif [[ "$USER_INPUT" =~ ^[0-9]+$ ]]; then
INDEX=$(($USER_INPUT - 1))
if [[ $INDEX -ge 0 && $INDEX -lt ${#SELECTED_VERSIONS[@]} ]]; then
SELECTED_VERSION=${SELECTED_VERSIONS[$INDEX]}
else
echo "无效的序号!"
continue
fi
else
SELECTED_VERSION=$USER_INPUT
fi
# 获取选定版本的详细信息
VERSION_INFO=$(echo "$VERSIONS_JSON" | jq -r --arg ver "$SELECTED_VERSION" '.versions[] | select(.id==$ver)')
if [[ -z "$VERSION_INFO" ]]; then
echo "未找到 $SELECTED_VERSION 版本的信息,请重新选择!"
continue
fi
# 获取服务器 JAR 下载链接
SERVER_DOWNLOAD_URL=$(echo "$VERSION_INFO" | jq -r '.url' | xargs curl -s | jq -r '.downloads.server.url')
if [[ -z "$SERVER_DOWNLOAD_URL" ]]; then
echo "未找到 $SELECTED_VERSION 服务器的下载链接,请重新选择!"
continue
fi
# 显示版本详情
echo -e "\nMinecraft 服务器版本详情:"
echo "版本号: $SELECTED_VERSION"
echo "下载路径: $DOWNLOAD_DIR/minecraft_server_$SELECTED_VERSION.jar"
echo "下载地址: $SERVER_DOWNLOAD_URL"
echo -e "\n是否确认下载?"
read -p "输入 Y 进行下载,其他任意键返回版本选择菜单: " CONFIRM
if [[ "$CONFIRM" =~ ^[Yy]$ ]]; then
echo "正在下载 Minecraft 服务器 $SELECTED_VERSION..."
curl -o "$DOWNLOAD_DIR/minecraft_server_$SELECTED_VERSION.jar" "$SERVER_DOWNLOAD_URL"
echo "下载完成:$DOWNLOAD_DIR/minecraft_server_$SELECTED_VERSION.jar"
exit 0
fi
done
done
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment