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 0a
aka 로 끝납니다 CR LF
. 0a
or 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에서 실행 중)
당신의 문제는 해결될 것입니다.