#!/usr/bin/env bash BASE_URL="https://gist.asfd.cn/jetsung/vscode/raw/HEAD/" LIST_FILE="index.txt" # 默认扩展 ID 列表文件 DESC_FILE="README.md" # 描述 Markdown 文件 IDE_CMD="code" # 默认 VSCode FORCE=false EXTRA="" VERBOSE=false # -v: 只显示详细扩展信息(纯文本单行格式),不安装 # 参数解析函数 parameters() { while getopts "s:f e:n:v" opt; do case $opt in s) IDE_CMD="$OPTARG" ;; f) FORCE=true ;; e) EXTRA="$OPTARG" ;; n) LIST_FILE="$OPTARG" ;; v) VERBOSE=true ;; \?) echo "无效参数: -$OPTARG" >&2; exit 1 ;; esac done shift $((OPTIND-1)) EXTRA="$EXTRA $@" } # 主函数 main() { parameters "$@" # 处理 LIST_FILE if [[ "$LIST_FILE" != "*.*" ]] && [[ "$LIST_FILE" != *.* ]]; then LIST_FILE="${LIST_FILE}.txt" fi URL_DESC="${BASE_URL}${DESC_FILE}" if $VERBOSE; then echo # -v 模式:下载 README.md,先提取表格数据行(跳过标题和分隔行),然后逐行处理输出纯文本格式 curl -s --fail "$URL_DESC" | awk ' # 只处理数据行:以 "| [**" 开头(名称带链接) /^\| \[\*\*/ { line = $0 # 提取名称:去除 [**name**][n] if (match(line, /\[\*\*([^*]+)\*\*\]\[\d+\]/)) { name = substr(line, RSTART + 3, RLENGTH - 7 - length(match(line, /\[\d+\]/))) # 调整去除 [n] # 更精确:从 ** 后到 ** 前 sub(/.*\[\*\*/, "", line) sub(/\*\*\].*/, "", line) name = line } else { name = "" } echo $name # 重置 line 为原始 line = $0 # 提取官方 ID:去除 ` if (match(line, /`([^`]+)`/)) { id_official = substr(line, RSTART + 1, RLENGTH - 2) } else { id_official = "" } # 提取其他 ID:第三列,通常 - sub(/.*\| [^|]* \| [^|]* \| /, "", line) # 临时去除到第三列后 if (match(line, /^ ([^ |]+) /)) { id_other = substr(line, RSTART + 1, RLENGTH - 2) } else { id_other = "-" } # 提取描述:第五列(最后一列) if (match($0, /\| ([^|]+) \| ([^|]+) \| ([^|]+) \| (.*) \|$/)) { desc = substr($0, RSTART + RLENGTH - length($4) - 1) # 复杂,改用 split } # 更可靠方式:用 split 分隔 | split($0, fields, "|") if (length(fields) >= 5) { name_field = fields[2] gsub(/^[ \t]+|[ \t]+$/, "", name_field) # 用之前提取的 name id_official_field = fields[3] gsub(/^[ \t]+|[ \t]+$/, "", id_official_field) gsub(/`/, "", id_official_field) id_other_field = fields[4] gsub(/^[ \t]+|[ \t]+$/, "", id_other_field) desc_field = fields[5] gsub(/^[ \t]+|[ \t]+$/, "", desc_field) printf "名称: %s \n扩展ID: %s \n扩展ID: %s \n描述: %s\n\n", name, id_official_field, id_other_field, desc_field } }' echo exit 0 fi # 非 -v 模式:正常下载 index.txt 并安装 URL_LIST="${BASE_URL}${LIST_FILE}" echo "从 $URL_LIST 下载扩展列表..." EXTENSIONS=$(curl -s --fail "$URL_LIST" | grep -v '^#' | grep -v '^$' | sed '/^$/d') if [ -z "$EXTENSIONS" ]; then echo "错误: 未获取到扩展列表或文件为空!请检查文件名(当前: $LIST_FILE)。" >&2 exit 1 fi BASE_CMD="$IDE_CMD --install-extension" if $FORCE; then EXTRA="--force $EXTRA" fi echo "开始为 $IDE_CMD 安装扩展(命令: $BASE_CMD ... $EXTRA)" echo "扩展列表:" echo "$EXTENSIONS" | tr ' ' '\n' echo "-----------------" echo "$EXTENSIONS" | tr ' ' '\n' | while read -r ext; do [ -z "$ext" ] && continue echo "安装: $ext" $BASE_CMD "$ext" $EXTRA || echo "警告: 安装 $ext 失败(可能已安装或 ID 不兼容)" done echo "-----------------" echo "所有扩展安装完成!请重启 IDE 以生效。" } main "$@"