Из этого сообщения об ошибке наизнанку, я думаю, что ваш файл menu.txt в формате DOS/Windows, а это означает, что каждая строка заканчивается символом возврата каретки и перевода строки. Инструменты Unix, такие как bash, ожидают, что строки заканчиваются только строкой (формат unix для текстовых файлов) и поэтому обрабатывают символ возврата каретки как часть строки. В вашем скрипте это означает, что переменная quantity
имеет номер и символ возврата каретки, а возврат каретки означает, что это недопустимый номер и вызывает ошибку.
Существует несколько способов исправить это. Вы можете запустить dos2unix
(или аналогичную программу) в файле menu.txt. Кроме того, вы также можете заставить сценарий обрезать возврат каретки; один способ сделать это - добавить возврат каретки в IFS
, поэтому команда read
будет обрабатывать ее как пробел и обрезать ее. BTW, было бы лучше сделать это (и присвоение «,» IFS) в качестве префикса для команды read
, чтобы они только применили к этой команде и не испортили вещи в других местах:
[ ! -f $INPUT ] &while IFS=$',\r' read ch ch1 menu rate quantity
Кроме того, этот тест выглядит обратным для меня. Вы действительно хотите запустить цикл, если входной файл не есть? Это использование &
затрудняет чтение; было бы лучше использовать явное if
(и дважды процитировать ссылку на переменную), как этот:
if [ -f "$INPUT" ]; then
while IFS=$',\r' read ch ch1 menu rate quantity; do
...
используйте команду подстановки «'», как –
вы можете быть более ясным в письменном виде весь синтаксис я не получаю это то, что у означает –