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

Shell脚本写数组冒泡排序出现Unary Operator expected报错如何解决

报错原因
  • 核心诱因是内层循环边界错误引发数组越界:Shell数组下标从0开始,你定义的数组最大有效下标为length-1,原代码内层循环逻辑为j < $length,当j = length - 1时,j+1 = length对应的数组元素为空值。
  • 数值比较语法[ ${array[j]} -gt ${array[$((j+1))]} ]中如果某一侧参数为空,Shell会将该语句识别为一元运算场景,因此抛出Unary Operator expected报错。
  • 小概率触发场景:如果用户输入的length不是合法正整数,也会触发同类报错,你提到输出结果正常,说明核心问题为数组越界。
修复方案

只需调整内层循环的边界即可,两种调整方式可选:

  • 标准冒泡优化写法:将内层循环条件改为j < $length - i - 1,每一轮排序完成后末尾的i个元素已经是升序状态,无需再参与比较,性能更高
  • 基础修复写法:将内层循环条件改为j < $length - 1,仅规避数组越界问题,不做性能优化

可选补充:增加输入合法性校验,确保用户输入的length为正整数,避免非法输入引发报错。

修复后的完整代码
#!/bin/bash

declare -a array
hold=0

echo "Input length of array: "
read length

# 可选新增:输入合法性校验
if ! [[ $length =~ ^[1-9][0-9]*$ ]]; then
    echo "Error: 请输入合法的正整数作为数组长度"
    exit 1
fi

for((i = 0; i < length; i++))
do
        echo "Enter number: "
        read input
        array+=($input)
done

echo " "
echo "Elements in array: "
echo "${array[*]}"

echo " "
echo "Sorted Array"

for((i = 0; i < $length; i++))
do
        # 仅修改了这一行的循环条件
        for((j = 0; j < $length - i - 1; j++))
        do
                if [ ${array[j]} -gt ${array[$((j+1))]} ]
                then
                        hold=${array[j]}
                        array[$j]=${array[$((j+1))]}
                        array[$((j+1))]=$hold
                fi
        done
done

echo "Sorted Elements in array: "
echo "${array[*]}"

内容的提问来源于stack exchange,提问作者IAN GABRIEL DURIAN

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 12:36:08