Ostatnio aktywny 1 month ago

通过命令行下载安装软件

Rewizja 47c312e268753cc45ab466bc12042761d0feb069

README.md Surowy

Linux 软件推荐

列表

名称 ID (apt) ID (dnf) 描述
cadaver cadaver command-line WebDAV client
apt.sh Surowy
1#!/usr/bin/env bash
2
3BASE_URL="https://gist.asfd.cn/jetsung/linux/raw/HEAD/"
4LIST_FILE="apt.txt" # 默认 apt 包列表文件
5DESC_FILE="README.md" # 描述 Markdown 文件
6EXTRA=""
7VERBOSE=false # -v: 只显示详细信息,不安装
8
9# 参数解析
10parameters() {
11 while getopts "e:n:v" opt; do
12 case $opt in
13 e) EXTRA="$OPTARG" ;;
14 n) LIST_FILE="$OPTARG" ;;
15 v) VERBOSE=true ;;
16 \?) echo "无效参数: -$OPTARG" >&2; exit 1 ;;
17 esac
18 done
19 shift $((OPTIND - 1))
20 EXTRA="$EXTRA $@"
21}
22
23# 主函数
24main() {
25 parameters "$@"
26
27 # 如果 LIST_FILE 没有扩展名,自动添加 .txt
28 if [[ "$LIST_FILE" != *.* ]]; then
29 LIST_FILE="${LIST_FILE}.txt"
30 fi
31
32 URL_DESC="${BASE_URL}${DESC_FILE}"
33
34 # -v 模式:解析 README.md 并显示软件详细信息
35 if $VERBOSE; then
36 echo "$URL_DESC 获取软件描述信息..."
37 echo
38 curl -s --fail "$URL_DESC" | awk '
39 /^\|.*\|.*\|.*\|.*\|$/ && NR > 2 { # 匹配数据行,跳过表头和分隔线
40 gsub(/^[ \t\r\n]+|[ \t\r\n]+$/, "") # 去除行首尾空白
41 split($0, fields, "|")
42 if (length(fields) < 5) next
43
44 # 名称(第2列)
45 name_raw = fields[2]
46 gsub(/^[ \t\r\n]+|[ \t\r\n]+$/, "", name_raw)
47 # 支持 [text](url) 或 **text**
48 if (match(name_raw, /\[([^]]+)\]/) || match(name_raw, /\*\*([^*]+)\*\*/)) {
49 name = substr(name_raw, RSTART + (substr(name_raw, RSTART, 1) == "[" ? 1 : 2),
50 RLENGTH - (substr(name_raw, RSTART, 1) == "[" ? 2 : 4))
51 } else {
52 name = name_raw
53 }
54
55 # apt ID(第3列,可能有 ` 或空)
56 apt_raw = fields[3]
57 gsub(/^[ \t\r\n]+|[ \t\r\n]+$/, "", apt_raw)
58 gsub(/`/, "", apt_raw) # 去除可能存在的反引号
59 if (apt_raw == "") apt_raw = "(无)"
60
61 # dnf ID(第4列,可能为空)
62 dnf_raw = fields[4]
63 gsub(/^[ \t\r\n]+|[ \t\r\n]+$/, "", dnf_raw)
64 gsub(/`/, "", dnf_raw)
65 if (dnf_raw == "") dnf_raw = "(无)"
66
67 # 描述(第5列)
68 desc = fields[5]
69 gsub(/^[ \t\r\n]+|[ \t\r\n]+$/, "", desc)
70
71 if (name == "" || desc == "") next
72
73 printf "名称: %s\napt 包名: %s\n dnf 包名: %s\n描述: %s\n\n", name, apt_raw, dnf_raw, desc
74 }'
75 echo
76 exit 0
77 fi
78
79 # 正常模式:下载包列表并使用 apt 安装
80 URL_LIST="${BASE_URL}${LIST_FILE}"
81 echo "$URL_LIST 下载软件列表..."
82 SOFTS=$(curl -s --fail "$URL_LIST" | grep -v '^#' | grep -v '^$' | sed '/^$/d')
83
84 if [ -z "$SOFTS" ]; then
85 echo "错误: 未获取到列表或文件为空!请检查文件名(当前: $LIST_FILE)。" >&2
86 exit 1
87 fi
88
89 # 将列表转为数组,避免管道子 shell 问题
90 mapfile -t soft_array <<< "$SOFTS"
91
92 BASE_CMD="sudo apt install -y"
93 echo "开始使用 apt 安装软件(命令: $BASE_CMD ... $EXTRA"
94 echo "安装列表:"
95 printf '%s\n' "${soft_array[@]}"
96 echo "-----------------"
97
98 for soft in "${soft_array[@]}"; do
99 [ -z "$soft" ] && continue
100 echo "安装: $soft"
101 $BASE_CMD "$soft" $EXTRA || echo "警告: 安装 $soft 失败"
102 done
103
104 echo "-----------------"
105 echo "所有软件安装完成!"
106}
107
108main "$@"
apt.txt Surowy
1cadaver