Я на Windows 7, используя Cygwin.

Мой скрипт и текстовый файл находятся в одном каталоге.

#!/bin/bash
while read name; do
echo "Name read from file - $name"
done < /home/Matt/servers.txt

Я получаю эту ошибку, и я не знаю почему, потому что это правильный синтаксис цикла while ..?

u0146121@U0146121-TPD-A ~/Matt
$ ./script.sh
./script.sh: line 4: syntax error near unexpected token `done'
./script.sh: line 4: `done < /home/Matt/servers.txt'

Кто-нибудь может сказать мне, что я делаю не так? Я думаю, это потому, что я нахожусь на окнах и использую Cygwin.

2 ответа2

0

Этот скрипт имеет окончание строки CR LF. Это более заметно с od .

$ od -c script
0000000   #   !   /   b   i   n   /   b   a   s   h  \r  \n   w   h   i
0000020   l   e       r   e   a   d       n   a   m   e   ;       d   o
0000040  \r  \n   e   c   h   o       "   N   a   m   e       r   e   a
0000060   d       f   r   o   m       f   i   l   e       -       $   n
0000100   a   m   e   "  \r  \n   d   o   n   e       <       /   h   o
0000120   m   e   /   M   a   t   t   /   s   e   r   v   e   r   s   .
0000140   t   x   t  \r  \n
0000145

Как видите, у меня есть символы \r (возврат каретки) и \n (перевод строки) в конце каждой строки, где вы должны иметь только символы \n . Это является результатом проблемы совместимости между системами Windows и * nix. Bash испытывает трудности при работе с символами \r .

Вы можете исправить свой скрипт, используя утилиту, такую как dos2unix или выполнив следующую команду sed :

sed -i 's/\r$//' script
0

Предыдущий ответ верен в том, что Windows поместит \r \n, но * nix системы примут только \n. Однако существует чрезвычайно простой способ решить эту проблему на компьютере с Windows.

В текстовом редакторе, таком как Textpad, выберите "Сохранить как", а под именем файла вы можете выбрать "Конец строки". Здесь сохраните его как "UNIX", и файл будет правильно закодирован с помощью \r, и ваши записи будут работать нормально.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .