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
相关产品推荐
相关产品推荐

