Это - ошибка, которую я получаю при выполнении:
./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
Вы делаете 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 ]
. С отдельным аргументом тест только для непустого аргумента, таким образом, это успешно выполняется, присвоения происходят, и бесконечные циклы начинаются.
Сделайте:
не Делайте: