Script de roteiro de classificação de bolha

0

Este é o erro que estou recebendo ao executar:

./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

Script:

#!/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
    
por nhershy 22.06.2017 / 07:04

1 resposta

2

Você está fazendo i <= ${#nums[@]} . Os arrays no bash são indexados em 0, como você já sabe, então o último elemento está em ${#nums[@]} - 1 . Quando i é ${#nums[@]} e você faz nums[$i]=${nums[$j]} ou nums[$j]=$t , você adiciona após o final da matriz, aumentando o tamanho da matriz e criando, assim, um loop infinito.

Os erros que você vê também se devem a isso, mas como a atribuição ainda não foi feita, ${array[non-existent index]} está vazio. Considere a saída em 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 ))

Isso continua até que a expressão seja [ -gt ] . Com um único argumento, o teste é apenas para um argumento não vazio, portanto, isso é bem-sucedido, as designações ocorrem e os loops infinitos começam.

Faça:

  • Sempre cite suas variáveis.

Não:

  • Teste a igualdade para testes de fim de matriz em idiomas com matrizes indexadas com 0.
por muru 22.06.2017 / 07:18