#!/usr/bin/zsh # 路径名称: 公共/函数.zsh # 脚本作用: 通用zsh函数合集 方便zsh脚本快速调用 # 第一作者: 寻觅(xunmiemail@vip.qq.com) # 创建时间: 2024年2月4日23:24:12 # 使用方法: 在言灵根目录下使用`. 公共/函数.zsh` # 启动言灵公共函数模块的标识符 言灵一函数=1 ############################################################################### # 终端配色 # ############################################################################### # 色彩配置 readonly 色彩重置='\e[0m' readonly 色彩=( '\e[92m' # 1: 亮绿 '\e[90m' # 2: 亮灰 '\e[31m' # 3: 暗红 '\e[32m' # 4: 暗绿 '\e[33m' # 5: 暗黄 '\e[95m' # 6: 亮紫 ) # 用于规范输出的工具 # 例: `输出 0 "执行成功"`; `输出 3 "请及时更新依赖"` # *-* 一 -> 整数 <- 1: 成功(亮绿); 2: 失败(暗红); 3: 信息(绿色); 4: 通知(黄色); 5: 异常(紫色) # *-* 二 -> 字符 <- 在命令行输出的字符串 输出() { echo -n "($(date +"%Y-%m-%d %H:%M:%S"))" if (($1 == 0)); then echo -e "${色彩[2]}[${色彩重置}${色彩[1]} 成功 ${色彩重置}${色彩[2]}]${色彩重置} $2" elif (($1 == 1)); then echo -e "${色彩[2]}[${色彩重置}${色彩[3]} 失败 ${色彩重置}${色彩[2]}]${色彩重置} $2" exit 1 elif (($1 == 2)); then echo -e "${色彩[2]}[${色彩重置}${色彩[4]} 信息 ${色彩重置}${色彩[2]}]${色彩重置} $2" elif (($1 == 3)); then echo -e "${色彩[2]}[${色彩重置}${色彩[5]} 通知 ${色彩重置}${色彩[2]}]${色彩重置} $2" elif (($1 == 4)); then echo -e "${色彩[2]}[${色彩重置}${色彩[6]} 异常 ${色彩重置}${色彩[2]}]${色彩重置} $2" return 1 fi } # 灰色信息(处理一些无关紧要的信息, 调用后在没有清除颜色之前会一直使用灰色输出) 色彩一灰色() { echo -e "${色彩[2]}\c" } # 清除颜色(一般和灰色信息连用) 色彩一清除() { echo -e "${色彩重置}\c" } ############################################################################### # 通用函数 # ############################################################################### # 更具用户输入判断是否需要继续 # *-* 一 -> 字符 <- 用于提示用户选择时候的提示语 # -*- 返回值: 如果 输入`是/Y/y/yes` 返会0, 其他情况返会1 是否() { 输出 3 "$1((是/否 Yes/No))" read r if echo "$r" | grep -Eq "^[是Yy][Ee]?[Ss]?$";then return 0 fi return 1 } # 用于判断两个版本号之间的大小 # 备注: 版本格式实例 1.0.0, v8.8, go1.20.8 # 例: `版本对比 "$1" "$2" && echo "1: $1" || echo "2: $2"` # *-* 一 -> 字符(版本1) <- 建议为本地版本 # *-* 二 -> 字符(版本2) <- 建议为需要对比的版本 # -*- 返回值: 如果 版本1 >= 版本2 则返会1, 否者返会0, 根据建议填写参数效果则是本地如果是最新版则不会进入if判断 版本对比() { # 判断版本是否为空 if [ -z "${1// }" ]; then return 0 elif [ -z "${2// }" ]; then return 1 fi # 使用IFS分割版本号为数组 IFS='.' read -r -A 版本数组A <<< ${1//[^0-9.]/} IFS='.' read -r -A 版本数组B <<< ${2//[^0-9.]/} # 逐段比较各个部分的大小 for ((i=1; i <= ${#版本数组A[@]}; i++)); do if (( ${版本数组A[i]} > ${版本数组B[i]} )); then return 1 elif (( ${版本数组A[i]} < ${版本数组B[i]} )); then return 0 fi done # 如果循环结束仍未返回,则认为两个版本号相等 return 1 } # 自动根据文件后缀选择响应的解压工具进行就地解压 # *-* 一 -> 字符(文件名) <- 压缩文件 解压(){ 文件名=$1 后缀="${文件名##*.}" if [[ ${文件名} == *".tar."* ]]; then 后缀="tar.${后缀}" fi # 根据后缀选择解压命令 case ${后缀} in "tar.gz" | "tgz") tar -xzvf ${文件名} ;; "tar.xz") tar -xJvf ${文件名} ;; "tar.bz2" | "tbz2") tar -xjvf ${文件名} ;; "zip") unzip ${文件名} ;; "rar") unrar x ${文件名} ;; "7z") 7z x ${文件名} ;; *) 输出 5 "不支持的压缩格式" ;; esac } # 自动获取并且解压压缩包 # *-* 一 -> 字符(网址) <- 在线获取压缩包的地址 获解(){ wget -t 3 --content-disposition -q --show-progress -c $1 || 输出 5 "无法下载程序包" 包名="$(ls -t | head -n1)" 输出 2 "已获取${包名}" 解压 ${包名} }