#!/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 $@" } 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 } # 检测表头行 /^\|/ && $0 ~ /\| 名称 \| 扩展 ID \|/ { in_table = 1 next } # 跳过分隔行(如 |:---|:---|...) in_table && /^\|[-:| ]+\|$/ { next } # 处理数据行 in_table && /^\|/ { gsub(/^\|/, "", $0) gsub(/\|$/, "", $0) n = split($0, fields, "\\|") if (n >= 4) { id = fields[2] gsub(/^[ \t]*`?/, "", id) gsub(/`?[ \t]*$/, "", id) if (id != "" && id != "-") { print id } } } # 遇到空行或非表格行,退出表格模式(可选增强) !/^\|/ && in_table { in_table = 0 } ' } 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 } /^\|/ && $0 ~ /\| 名称 \| 扩展 ID \|/ { in_table = 1 next } in_table && /^\|[-:| ]+\|$/ { next } in_table && /^\|/ { gsub(/^\|/, "", $0) gsub(/\|$/, "", $0) n = split($0, fields, "\\|") if (n >= 5) { 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 { 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 "$@"