You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Shell脚本数组格式化:将无序数字数组转为指定连续区间格式

解决方案

可以通过遍历数组并追踪连续数字的起始和结束值,将数组格式化为指定的范围字符串。以下是完整的Shell脚本实现:

# 定义原始数组
nums=(4 5 6 7 9 10 14 15 16 18 19 20 22 23 24 25 27 28 29 30)

# 如果数组未排序,可取消下面这行注释进行排序
# nums=($(printf '%s\n' "${nums[@]}" | sort -n))

# 初始化存储范围的数组和追踪变量
ranges=()
start=${nums[0]}
prev=${nums[0]}

# 遍历数组从第二个元素开始
for num in "${nums[@]:1}"; do
    # 检查当前数字是否与前一个数字连续
    if (( num != prev + 1 )); then
        # 如果起始值等于前一个值,说明是单个数字
        if (( start == prev )); then
            ranges+=("$start")
        else
            # 否则是一个连续范围
            ranges+=("$start-$prev")
        fi
        # 更新起始值为当前数字
        start=$num
    fi
    # 更新前一个数字为当前数字
    prev=$num
done

# 处理最后一组连续数字或单个数字
if (( start == prev )); then
    ranges+=("$start")
else
    ranges+=("$start-$prev")
fi

# 将范围数组合并为单个字符串,用空格分隔
output=$(IFS=' '; echo "${ranges[*]}")

# 输出结果
echo "$output"

代码说明:

  1. 数组初始化:定义原始数字数组,若数组未排序,可通过sort -n命令先排序。
  2. 追踪变量:start记录当前连续范围的起始值,prev记录上一个遍历到的数字。
  3. 遍历逻辑:
    • 每次检查当前数字是否与前一个数字连续(即num == prev + 1)。
    • 若不连续,将当前范围(单个数字或起始-结束)加入ranges数组,并重置start为当前数字。
  4. 收尾处理:遍历结束后,将最后一组范围加入ranges数组。
  5. 合并结果:通过设置IFS=' '将ranges数组合并为空格分隔的字符串,赋值给output变量。

运行脚本后,output变量的值即为:4-7 9-10 14-16 18-20 22-24 25 27-30。

内容的提问来源于stack exchange,提问作者krishna narreddula

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 00:10:59