Принятие tty "приготовленный" режим, ctrl - D работает путем завершения входной обработки строки и отправки данных, уже введенных приложением. Таким образом, при вводе "abc", сопровождаемой ctrl - D, те три байта будут отосланы к приложению.
Теперь, как приложение обычно определяет конец файла? EOF принят, когда чтение возвращает 0 байтов. Таким образом, необходимо заставить чтение возвращать 0 байтов. Если вы, в которых первый хит входит и затем ctrl - D, сначала что-либо, которое вы ввели, отправляетесь в приложение вместе с символом новой строки. Затем ctrl - D вызывает любые данные, в которые вы вошли (т.е. ничто!), чтобы быть отправленным в приложение, которое читает 0 байтов и предполагает EOF.
, Если вы входите, что-либо после эти входит прежде, чем совершить нападки ctrl - D затем, приложение получает те нажатия клавиш и ожидает больше. Таким образом для генерации EOF без первого удара входят , совершают нападки ctrl - D дважды подряд.
Так для ответа на вопрос:Вы сначала ввели какие-либо символы (кроме новой строки), прежде чем нажать ctrl - D ? Если да, попробуйте это дважды подряд.
Это можно проверить, например:
$ wc -l
test123 0 1 7
(нажмите ctrl - D дважды после test123
.)
Утилита wc
показывает количество прочитанных строк, слов и символов. Строки 0, так как вы не ввели новую строку, а test123
- это одно слово и 7 символов.
Вы вызываете команду [
с операторами сравнения -lt
/ -gt
десятичных целых чисел для операндов, которые не всегда являются десятичными целыми числами.
Вы можете увидеть, что произойдет, если запустить скрипт с bash -x
. Вы увидите такие вещи, как:
+ f=
+ '[' '' -gt 0 ']'
./myscript: line 15: [: : integer expression expected
С:
while [ "$i" -lt "$n" ]
do
[...]
d=${array[$i+1]}
На последнем проходе в этом цикле вы попытаетесь получить доступ за пределами последнего элемента массива, поэтому $d
будет пустым.
Вы также инициализируете $b
как строку 0, а затем обращаетесь к ней как к массиву. Посмотрите также, как f=${b[$j]}
даст вам пустой $f
, за исключением случая, когда $j
равно 0.
Я не знаю, что вы пытаетесь сделать с этим кодом, но, похоже, вам нужно вернуться к чертежной доске.