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.