Cygwin에서 라인 스크립트를 읽는 데 문제가 있습니다.

Cygwin에서 라인 스크립트를 읽는 데 문제가 있습니다.

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'

누구든지 내가 뭘 잘못하고 있는지 말해 줄 수 있나요? 나는 Windows에 있고 Cygwin을 사용하고 있기 때문이라고 생각합니다.

답변1

~처럼지적통과극단론자--, 스크립트에 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각 줄의 끝에는 (캐리지 리턴) 및 (줄 바꿈) 문자가 있지만 문자만 포함해야 합니다. 이는 Windows와 *nix 시스템 간의 호환성 문제로 인해 발생합니다. Bash는 이러한 문자를 처리하는 데 어려움을 겪습니다.\n\n\r

dos2unix유사한 유틸리티를 사용하거나 다음 줄을 실행하여 스크립트를 수정할 수 있습니다.

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

답변2

이것은 hexdump 스크립트입니다.

00000000  23 21 2f 62 69 6e 2f 62  61 73 68 0d 0a 77 68 69  |#!/bin/bash..whi|
00000010  6c 65 20 72 65 61 64 20  6e 61 6d 65 3b 20 64 6f  |le read name; do|
00000020  0d 0a 65 63 68 6f 20 22  4e 61 6d 65 20 72 65 61  |..echo "Name rea|

이 줄은 0d 0aaka 로 끝납니다 CR LF. 0aor only 로 변경하세요 LF.

답변3

사용 중인 파일의 끝에는 Windows 스타일 줄 바꿈(CR)이 있습니다(Windows XP에서 Cygwin을 사용하는 경우에도 동일한 일이 발생했습니다).

"dos2unix.exe"를 사용하여 수정하면 괜찮을 것입니다.

$ dos2unix.exe script.sh

dos2unix: converting file script.sh to Unix format...

그런 다음 스크립트를 다시 실행하면 이러한 오류 메시지가 더 이상 나타나지 않습니다.

답변4

문제는 스크립트 파일이 UNIX 형식이 아니기 때문에 다음을 사용할 수 있다는 것입니다.

vi new_name_for_your_script

복사 붙여 넣기 (Windows에서 실행 중)

당신의 문제는 해결될 것입니다.

관련 정보