используете ли вы карту Nvidia с настройкой с двойным экраном?
Если это так, у меня была такая же проблема, и она была решена следующим образом: выключите компьютер, отключите второй монитор, переключите снова включите компьютер, запустите «sudo nvidia-settings», подключите второй монитор, запустите «Обнаруживать дисплеи» в графическом интерфейсе Nvidia и внесите необходимые настройки перед сохранением настроек. Важным моментом является то, что на экране, который вы хотите, чтобы войти в систему был установлен на «Номер экрана: 0».
В моем случае, оставив второй монитор подключенным до запуска 'nvidia-settings' оставил его как экран 0 по какой-то причине, но, подключив его после, это было отсортировано.
Вы делаете i <= ${#nums[@]}. Массивы в bash индексируются 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 ]. С помощью одного аргумента тест предназначен только для непустого аргумента, поэтому это происходит успешно, выполняются назначения и начинаются бесконечные циклы.
Do:
Всегда указывайте свои переменные.Не:
Всегда указывайте свои переменные.