macOS下提取.NET Runtime版本并生成数组的Shell脚本问题
macOS下提取.NET Runtime版本并判断版本要求
问题分析
你执行dotnet --list-runtimes后,现有脚本只能提取第一个版本号,无法生成包含所有版本的数组,核心原因是没有循环处理命令输出的每一行数据,仅处理了第一行。
解决脚本
以下是完整的bash脚本,可提取所有.NET Runtime版本号并判断是否存在≥6.0.11的版本:
#!/bin/bash # 定义目标版本 target_version="6.0.11" # 提取所有.NET Core/AspNetCore Runtime版本号到数组 runtime_versions=() while read -r _ version _; do runtime_versions+=("$version") done < <(dotnet --list-runtimes | grep -E 'Microsoft\.(NETCore|AspNetCore)\.App') # 版本比较函数:判断第一个版本是否大于等于第二个 version_ge() { # 将版本号按.拆分成数组 local v1_parts=(${1//./ }) local v2_parts=(${2//./ }) # 获取最长的版本段长度 local max_segments=$(( ${#v1_parts[@]} > ${#v2_parts[@]} ? ${#v1_parts[@]} : ${#v2_parts[@]} )) # 逐段比较版本号 for ((i=0; i<max_segments; i++)); do # 空的版本段视为0 local num1=${v1_parts[i]:-0} local num2=${v2_parts[i]:-0} if (( num1 > num2 )); then return 0 elif (( num1 < num2 )); then return 1 fi done # 所有段都相等,返回相等 return 0 } # 检查数组中的版本 found_matching=0 echo "已安装的.NET Runtime版本:${runtime_versions[*]}" for ver in "${runtime_versions[@]}"; do if version_ge "$ver" "$target_version"; then echo "✅ 找到符合要求的版本:$ver" found_matching=1 # 若只需确认存在,找到第一个后可直接退出循环 # break fi done if (( found_matching == 1 )); then echo -e "\n结论:存在高于或等于 ${target_version} 的.NET Runtime版本" else echo -e "\n结论:不存在高于或等于 ${target_version} 的.NET Runtime版本" fi
脚本说明
- 提取版本号:通过
dotnet --list-runtimes获取输出,用grep筛选核心Runtime类型,再通过while read循环逐行读取,提取第二列的版本号存入数组。 - 版本比较逻辑:将版本号按
.拆分成数字段,逐段比较,避免字符串直接比较的误差(比如6.0.100和6.0.11的字符串比较问题)。 - 结果检查:遍历数组中的每个版本,调用比较函数判断是否符合要求,最终输出结论。
使用方法
- 将上述代码保存为
check_dotnet_version.sh - 赋予执行权限:
chmod +x check_dotnet_version.sh - 运行脚本:
./check_dotnet_version.sh
内容的提问来源于stack exchange,提问作者Thunder
相关产品推荐
相关产品推荐

