Сценарий Bash пузырьковой сортировки

Это - ошибка, которую я получаю при выполнении:

./sortNums.sh: line 10: [: 4: unary operator expected
./sortNums.sh: line 10: [: 4: unary operator expected
./sortNums.sh: line 10: [: 4: unary operator expected
./sortNums.sh: line 10: [: 4: unary operator expected
./sortNums.sh: line 10: [: 4: unary operator expected
./sortNums.sh: line 10: [: 4: unary operator expected
./sortNums.sh: line 10: [: 4: unary operator expected
./sortNums.sh: line 10: [: 4: unary operator expected
./sortNums.sh: line 10: [: -gt: unary operator expected
./sortNums.sh: line 10: [: -gt: unary operator expected
./sortNums.sh: line 10: [: -gt: unary operator expected
./sortNums.sh: line 10: [: -gt: unary operator expected
./sortNums.sh: line 10: [: -gt: unary operator expected
./sortNums.sh: line 10: [: -gt: unary operator expected
./sortNums.sh: line 10: [: -gt: unary operator expected
./sortNums.sh: line 10: [: -gt: unary operator expected

Сценарий:

#!/bin/bash

bubbleSort()
{
for ((i=0;i<=${#nums[@]};i++))
do
    for ((j=0;j<=${#nums[@]};j++))
    do
        if [ ${nums[$i]} -gt ${nums[$j]} ]
        then
            t=${nums[$i]}
            nums[$i]=${nums[$j]}
            nums[$j]=$t
        fi
    done
done
}

declare -a nums=(89 62 11 75 8 33 95 4)
echo ${nums[*]} #prints out all elems
bubbleSort
echo ${nums[*]} #prints out all elems
0
задан 21 June 2017 в 22:06

1 ответ

Вы делаете i <= ${#nums[@]}. Массивы в ударе 0-индексируемы, как Вы уже знаете, таким образом, последний элемент в ${#nums[@]} - 1. Когда i ${#nums[@]}, и Вы делаете nums[$i]=${nums[$j]} или nums[$j]=$t, Вы добавляете после конца массива, увеличивая размер массива и таким образом создавая бесконечный цикл.

ошибки, которые Вы видите, происходят также из-за этого, но потому что присвоение еще не было сделано, ${array[non-existent index]} просто пусто. Рассмотрите вывод под bash -x:

+ (( j++ ))                                     # j is 8
+ (( j<=8 ))                                    # perfectly fine
+ '[' 4 -gt ']'                                 # but nums[j] is empty
./foo.sh: line 9: [: 4: unary operator expected
+ (( j++ ))
+ (( j<=8 ))
+ (( i++ ))
+ (( i<=8 ))
+ (( j=0 ))
+ (( j<=8 ))
+ '[' 89 -gt 4 ']'
+ t=89
+ nums[$i]=4
+ nums[$j]=89
+ (( j++ ))
+ (( j<=8 ))
+ '[' 4 -gt 4 ']'
+ (( j++ ))
+ (( j<=8 ))
+ '[' 4 -gt 62 ']'
+ (( j++ ))
+ (( j<=8 ))
+ '[' 4 -gt 75 ']'
+ (( j++ ))
+ (( j<=8 ))

Это продолжается, пока выражение не [ -gt ]. С отдельным аргументом тест только для непустого аргумента, таким образом, это успешно выполняется, присвоения происходят, и бесконечные циклы начинаются.

Сделайте:

  • Всегда заключают Ваши переменные в кавычки.

не Делайте:

  • Тест для равенства для конца массива тестирует на языках с 0 индексными массивами.
2
ответ дан 3 November 2019 в 01:31

Другие вопросы по тегам:

Похожие вопросы: