jetsung revisó este gist 4 months ago. Ir a la revisión
1 file changed, 2 insertions, 1 deletion
apt.txt
| @@ -1 +1,2 @@ | |||
| 1 | - | cadaver | |
| 1 | + | cadaver | |
| 2 | + | aria2 | |
jetsung revisó este gist 4 months ago. Ir a la revisión
1 file changed, 1 insertion
README.md
| @@ -4,3 +4,4 @@ | |||
| 4 | 4 | | 名称 | ID (apt) | ID (dnf) | 描述 | | |
| 5 | 5 | |:---|:---|:---|:---| | |
| 6 | 6 | | cadaver | `cadaver` | | command-line WebDAV client | | |
| 7 | + | | aria2 | `aria2` | `aria2` | High speed download utility | | |
jetsung revisó este gist 4 months ago. Ir a la revisión
1 file changed, 49 insertions, 7 deletions
apt.sh renombrado a linux.sh
| @@ -1,7 +1,7 @@ | |||
| 1 | 1 | #!/usr/bin/env bash | |
| 2 | 2 | ||
| 3 | 3 | BASE_URL="https://gist.asfd.cn/jetsung/linux/raw/HEAD/" | |
| 4 | - | LIST_FILE="apt.txt" # 默认 apt 包列表文件 | |
| 4 | + | LIST_FILE="apt.txt" # 默认列表文件(可被自动切换或 -n 覆盖) | |
| 5 | 5 | DESC_FILE="README.md" # 描述 Markdown 文件 | |
| 6 | 6 | EXTRA="" | |
| 7 | 7 | VERBOSE=false # -v: 只显示详细信息,不安装 | |
| @@ -20,6 +20,19 @@ parameters() { | |||
| 20 | 20 | EXTRA="$EXTRA $@" | |
| 21 | 21 | } | |
| 22 | 22 | ||
| 23 | + | # 检测包管理器并返回命令(如 "apt" 或 "dnf" 或 "yum") | |
| 24 | + | detect_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 | + | ||
| 23 | 36 | # 主函数 | |
| 24 | 37 | main() { | |
| 25 | 38 | parameters "$@" | |
| @@ -55,7 +68,7 @@ main() { | |||
| 55 | 68 | # apt ID(第3列,可能有 ` 或空) | |
| 56 | 69 | apt_raw = fields[3] | |
| 57 | 70 | gsub(/^[ \t\r\n]+|[ \t\r\n]+$/, "", apt_raw) | |
| 58 | - | gsub(/`/, "", apt_raw) # 去除可能存在的反引号 | |
| 71 | + | gsub(/`/, "", apt_raw) | |
| 59 | 72 | if (apt_raw == "") apt_raw = "(无)" | |
| 60 | 73 | ||
| 61 | 74 | # dnf ID(第4列,可能为空) | |
| @@ -70,13 +83,42 @@ main() { | |||
| 70 | 83 | ||
| 71 | 84 | if (name == "" || desc == "") next | |
| 72 | 85 | ||
| 73 | - | printf "名称: %s\napt 包名: %s\n dnf 包名: %s\n描述: %s\n\n", name, apt_raw, dnf_raw, desc | |
| 86 | + | printf "名称: %s\napt 包名: %s\ndnf 包名: %s\n描述: %s\n\n", name, apt_raw, dnf_raw, desc | |
| 74 | 87 | }' | |
| 75 | 88 | echo | |
| 76 | 89 | exit 0 | |
| 77 | 90 | fi | |
| 78 | 91 | ||
| 79 | - | # 正常模式:下载包列表并使用 apt 安装 | |
| 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 | + | ||
| 80 | 122 | URL_LIST="${BASE_URL}${LIST_FILE}" | |
| 81 | 123 | echo "从 $URL_LIST 下载软件列表..." | |
| 82 | 124 | SOFTS=$(curl -s --fail "$URL_LIST" | grep -v '^#' | grep -v '^$' | sed '/^$/d') | |
| @@ -86,11 +128,11 @@ main() { | |||
| 86 | 128 | exit 1 | |
| 87 | 129 | fi | |
| 88 | 130 | ||
| 89 | - | # 将列表转为数组,避免管道子 shell 问题 | |
| 131 | + | # 将列表转为数组 | |
| 90 | 132 | mapfile -t soft_array <<< "$SOFTS" | |
| 91 | 133 | ||
| 92 | - | BASE_CMD="sudo apt install -y" | |
| 93 | - | echo "开始使用 apt 安装软件(命令: $BASE_CMD ... $EXTRA)" | |
| 134 | + | echo "检测到包管理器: $PM_NAME" | |
| 135 | + | echo "开始使用 $PM_NAME 安装软件(命令: $BASE_CMD ... $EXTRA)" | |
| 94 | 136 | echo "安装列表:" | |
| 95 | 137 | printf '%s\n' "${soft_array[@]}" | |
| 96 | 138 | echo "-----------------" | |
jetsung revisó este gist 4 months ago. Ir a la revisión
3 files changed, 115 insertions
README.md(archivo creado)
| @@ -0,0 +1,6 @@ | |||
| 1 | + | # Linux 软件推荐 | |
| 2 | + | ||
| 3 | + | ## 列表 | |
| 4 | + | | 名称 | ID (apt) | ID (dnf) | 描述 | | |
| 5 | + | |:---|:---|:---|:---| | |
| 6 | + | | cadaver | `cadaver` | | command-line WebDAV client | | |
apt.sh(archivo creado)
| @@ -0,0 +1,108 @@ | |||
| 1 | + | #!/usr/bin/env bash | |
| 2 | + | ||
| 3 | + | BASE_URL="https://gist.asfd.cn/jetsung/linux/raw/HEAD/" | |
| 4 | + | LIST_FILE="apt.txt" # 默认 apt 包列表文件 | |
| 5 | + | DESC_FILE="README.md" # 描述 Markdown 文件 | |
| 6 | + | EXTRA="" | |
| 7 | + | VERBOSE=false # -v: 只显示详细信息,不安装 | |
| 8 | + | ||
| 9 | + | # 参数解析 | |
| 10 | + | parameters() { | |
| 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 | + | # 主函数 | |
| 24 | + | main() { | |
| 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 | + | ||
| 108 | + | main "$@" | |
apt.txt(archivo creado)
| @@ -0,0 +1 @@ | |||
| 1 | + | cadaver | |