Last active 1 month ago

通过命令行下载安装软件

README.md Raw

Linux 软件推荐

列表

名称 ID (apt) ID (dnf) 描述
cadaver cadaver command-line WebDAV client
aria2 aria2 aria2 High speed download utility
apt.txt Raw
1cadaver
2aria2
linux.sh Raw
1#!/usr/bin/env bash
2
3BASE_URL="https://gist.asfd.cn/jetsung/linux/raw/HEAD/"
4LIST_FILE="apt.txt" # 默认列表文件(可被自动切换或 -n 覆盖)
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# 检测包管理器并返回命令(如 "apt" 或 "dnf" 或 "yum")
24detect_package_manager() {
25 if command -v apt >/dev/null 2>&1; then
26 echo "apt"
27 elif command -v dnf >/dev/null 2>&1; then
28 echo "dnf"
29 elif command -v yum >/dev/null 2>&1; then
30 echo "yum"
31 else
32 echo "none"
33 fi
34}
35
36# 主函数
37main() {
38 parameters "$@"
39
40 # 如果 LIST_FILE 没有扩展名,自动添加 .txt
41 if [[ "$LIST_FILE" != *.* ]]; then
42 LIST_FILE="${LIST_FILE}.txt"
43 fi
44
45 URL_DESC="${BASE_URL}${DESC_FILE}"
46
47 # -v 模式:解析 README.md 并显示软件详细信息
48 if $VERBOSE; then
49 echo "$URL_DESC 获取软件描述信息..."
50 echo
51 curl -s --fail "$URL_DESC" | awk '
52 /^\|.*\|.*\|.*\|.*\|$/ && NR > 2 { # 匹配数据行,跳过表头和分隔线
53 gsub(/^[ \t\r\n]+|[ \t\r\n]+$/, "") # 去除行首尾空白
54 split($0, fields, "|")
55 if (length(fields) < 5) next
56
57 # 名称(第2列)
58 name_raw = fields[2]
59 gsub(/^[ \t\r\n]+|[ \t\r\n]+$/, "", name_raw)
60 # 支持 [text](url) 或 **text**
61 if (match(name_raw, /\[([^]]+)\]/) || match(name_raw, /\*\*([^*]+)\*\*/)) {
62 name = substr(name_raw, RSTART + (substr(name_raw, RSTART, 1) == "[" ? 1 : 2),
63 RLENGTH - (substr(name_raw, RSTART, 1) == "[" ? 2 : 4))
64 } else {
65 name = name_raw
66 }
67
68 # apt ID(第3列,可能有 ` 或空)
69 apt_raw = fields[3]
70 gsub(/^[ \t\r\n]+|[ \t\r\n]+$/, "", apt_raw)
71 gsub(/`/, "", apt_raw)
72 if (apt_raw == "") apt_raw = "(无)"
73
74 # dnf ID(第4列,可能为空)
75 dnf_raw = fields[4]
76 gsub(/^[ \t\r\n]+|[ \t\r\n]+$/, "", dnf_raw)
77 gsub(/`/, "", dnf_raw)
78 if (dnf_raw == "") dnf_raw = "(无)"
79
80 # 描述(第5列)
81 desc = fields[5]
82 gsub(/^[ \t\r\n]+|[ \t\r\n]+$/, "", desc)
83
84 if (name == "" || desc == "") next
85
86 printf "名称: %s\napt 包名: %s\ndnf 包名: %s\n描述: %s\n\n", name, apt_raw, dnf_raw, desc
87 }'
88 echo
89 exit 0
90 fi
91
92 # 正常模式:检测包管理器
93 PM=$(detect_package_manager)
94
95 case "$PM" in
96 apt)
97 BASE_CMD="sudo apt install -y"
98 PM_NAME="apt"
99 ;;
100 dnf)
101 BASE_CMD="sudo dnf install -y"
102 PM_NAME="dnf"
103 ;;
104 yum)
105 BASE_CMD="sudo yum install -y"
106 PM_NAME="yum"
107 ;;
108 none)
109 echo "错误: 未检测到支持的包管理器(apt、dnf 或 yum)!" >&2
110 exit 1
111 ;;
112 esac
113
114 # 自动切换列表文件(如果检测到 dnf/yum 且存在 dnf.txt)
115 if [[ "$PM" == "dnf" || "$PM" == "yum" ]]; then
116 if [[ "$LIST_FILE" == "apt.txt" ]] && curl -s --head --fail "${BASE_URL}dnf.txt" >/dev/null; then
117 LIST_FILE="dnf.txt"
118 echo "检测到 $PM_NAME 系统,自动切换到 dnf.txt 列表文件。"
119 fi
120 fi
121
122 URL_LIST="${BASE_URL}${LIST_FILE}"
123 echo "$URL_LIST 下载软件列表..."
124 SOFTS=$(curl -s --fail "$URL_LIST" | grep -v '^#' | grep -v '^$' | sed '/^$/d')
125
126 if [ -z "$SOFTS" ]; then
127 echo "错误: 未获取到列表或文件为空!请检查文件名(当前: $LIST_FILE)。" >&2
128 exit 1
129 fi
130
131 # 将列表转为数组
132 mapfile -t soft_array <<< "$SOFTS"
133
134 echo "检测到包管理器: $PM_NAME"
135 echo "开始使用 $PM_NAME 安装软件(命令: $BASE_CMD ... $EXTRA"
136 echo "安装列表:"
137 printf '%s\n' "${soft_array[@]}"
138 echo "-----------------"
139
140 for soft in "${soft_array[@]}"; do
141 [ -z "$soft" ] && continue
142 echo "安装: $soft"
143 $BASE_CMD "$soft" $EXTRA || echo "警告: 安装 $soft 失败"
144 done
145
146 echo "-----------------"
147 echo "所有软件安装完成!"
148}
149
150main "$@"