![': недопустимый идентификатор для чтения](https://rvso.com/image/1539553/'%3A%20%D0%BD%D0%B5%D0%B4%D0%BE%D0%BF%D1%83%D1%81%D1%82%D0%B8%D0%BC%D1%8B%D0%B9%20%D0%B8%D0%B4%D0%B5%D0%BD%D1%82%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D1%80%20%D0%B4%D0%BB%D1%8F%20%D1%87%D1%82%D0%B5%D0%BD%D0%B8%D1%8F.png)
Я использую Notepad++ и набираю:
read s
echo "$s"
Выходные данные:
И затем я пытаюсь поставить точку с запятой:
read s;
echo "$s"
и выход:
Я сохраняю файл как q.sh
и запускаю с помощью cygwin, но я все еще не могу использовать read
оператор, поэтому я запутался. Я пробовал другие редакторы, vi
но вывод тот же.
Что не так? Как заставить это работать?
решение1
Текстовый файл, который составляет скрипт оболочки, был написан в Notepad++. Этот редактор сохраняет файлы как текстовые файлы DOS по умолчанию, которые, с точки зрения Unix, имеют лишний возврат каретки ( \r
) в конце каждой строки. Это сбивает с толку sh
.
Чтобы удалить его:
$ tr -d '\r' <q.sh >q-new.sh
$ mv q-new.sh q.sh
Сценарийделаетотсутствует #!
-строка (как указано в комментариях), но если вы запускаете его с явным интерпретатором ( sh q.sh
), это не нужно.
Добавление строки
#!/bin/sh
(после chmod +x q.sh
) запуск его в качестве будет ./q.sh
вести себя точно так же, как запуск его с sh q.sh
.
решение2
Другой способ преобразовать возврат каретки для Unix, если у вас есть доступ к Notepad++. В Notepad, перейдите: Правка -> Конвертация EOL -> Unix (LF)
На французском это: Edition -> Convertir les sauts de ligne -> Converti au format Unix (LF)
Это может быть быстрее.