#!/usr/bin/env bash BASE_URL="https://gist.asfd.cn/jetsung/vscode/raw/HEAD/" DESC_FILE="README.md" IDE_CMD="code" FORCE=false EXTRA="" VERBOSE=false # 参数解析 parameters() { while getopts "s:f e:n:v" opt; do case $opt in s) IDE_CMD="$OPTARG" ;; f) FORCE=true ;; e) EXTRA="$OPTARG" ;; n) DESC_FILE="$OPTARG" ;; # -n now sets the README/md file v) VERBOSE=true ;; \?) echo "无效参数: -$OPTARG" >&2; exit 1 ;; esac done shift $((OPTIND-1)) EXTRA="$EXTRA $@" } # 从 README.md 提取扩展 ID 列表(仅官方扩展 ID) extract_extensions() { local content if [[ "$DESC_FILE" == http* ]]; then content=$(curl -s --fail "$DESC_FILE") elif [[ -f "$DESC_FILE" ]]; then content=$(cat "$DESC_FILE") else content=$(curl -s --fail "${BASE_URL}${DESC_FILE}") fi if [ $? -ne 0 ] || [ -z "$content" ]; then echo "错误:无法加载 README 文件($DESC_FILE)" >&2 exit 1 fi echo "$content" | awk ' BEGIN { in_table = 0 } /^\|/ && /名称.*扩展 ID/ { in_table = 1 next } in_table && /^\|[-| ]+$/ { next } # 跳过分隔行 in_table && /^\|/ { gsub(/^\|/, "", $0) gsub(/\|$/, "", $0) split($0, fields, " \\| ") if (length(fields) >= 3) { id = fields[2] # "扩展 ID" 是第二列(fields[1] 是名称) gsub(/^[ \t]*`?/, "", id) gsub(/`?[ \t]*$/, "", id) if (id != "" && id != "-") { print id } } } /^$/ { in_table = 0 } # 表格结束 ' } # 显示详细信息(-v 模式) show_verbose() { local content if [[ "$DESC_FILE" == http* ]]; then content=$(curl -s --fail "$DESC_FILE") elif [[ -f "$DESC_FILE" ]]; then content=$(cat "$DESC_FILE") else content=$(curl -s --fail "${BASE_URL}${DESC_FILE}") fi echo echo "$content" | awk ' BEGIN { in_table = 0 } /^\|/ && /名称.*扩展 ID/ { in_table = 1 next } in_table && /^\|[-| ]+$/ { next } in_table && /^\|/ { gsub(/^\|/, "", $0) gsub(/\|$/, "", $0) split($0, fields, " \\| ") if (length(fields) >= 4) { name_raw = fields[1] id = fields[2] desc = fields[4] # 提取 **...** 中的名称 if (match(name_raw, /\*\*([^*]+)\*\*/)) { name = substr(name_raw, RSTART+2, RLENGTH-4) } else { gsub(/[\[\]\*\`]/, "", name_raw) name = name_raw } gsub(/^[ \t]*`?/, "", id) gsub(/`?[ \t]*$/, "", id) gsub(/^[ \t]+|[ \t]+$/, "", desc) if (id != "" && id != "-") { printf "名称: %s\n扩展ID: %s\n描述: %s\n\n", name, id, desc } } } /^$/ { in_table = 0 } ' echo } # 主函数 main() { parameters "$@" if $VERBOSE; then show_verbose exit 0 fi echo "正在从 $DESC_FILE 提取扩展列表..." EXTENSIONS=$(extract_extensions) if [ -z "$EXTENSIONS" ]; then echo "错误:未找到有效的扩展 ID 列表!" >&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" echo "-----------------" while IFS= read -r ext; do [ -z "$ext" ] && continue echo "安装: $ext" $BASE_CMD "$ext" $EXTRA || echo "警告: 安装 $ext 失败(可能已安装或 ID 无效)" done <<< "$EXTENSIONS" echo "-----------------" echo "所有扩展安装完成!请重启 IDE 以生效。" } main "$@"