2011-08-29 1 views
4

W/암탉 내가 다음 코드를 실행하면"구문 오류 : 예기치 않은 파일의 끝"문

#!/bin/bash 
if [ "foo" = "foo" ]; 
then 
echo "true" 
else 
echo "false" 
fi 
echo "end" 

내가

sfm_write_buffer_test.sh: line 9: syntax error: unexpected end of file 

이 어떤을하지 않습니다 얻을 니펫 감각. echo 문은 잘 작동하지만 if 문이 발생하면 위에서 언급 한 오류가 발생합니다.

+4

if 문에서 후행 세미콜론을 제거해보십시오. –

+1

위의 코드를 복사하여 내 시스템의 스크립트에 붙여 넣기 만하면됩니다. 결과는'true'와'end' 두 줄로 나타납니다. bash 버전 2.01.1, 3.2.25 및 4.2.8에서 동일한 결과가 나타납니다. –

+0

가장 일반적인 FAQ 중 하나입니다. 놀랍게도 복제품과 가까운 거리에서 오랜 시간이 걸렸습니다. –

답변

8

Cygwin에 있습니다. 맞습니까?

주석에서 언급했듯이 스크립트를 복사하여 붙여 넣으면 내 시스템에서 실행할 수 있습니다. 출력은

true 
end 

입니다하지만 윈도우 스타일 '\r\n'에 유닉스 스타일 '\n'에서 라인 엔딩을 변경하면, 당신이있어 같은 오류가 발생합니다.

Windows 스타일의 줄 끝을 사용하면 bash에 then 키워드가 표시되지 않습니다. then\r이라는 명령이 표시됩니다. if 키워드에 대해 then 또는 fi과 일치하는 항목을 검색하므로이 항목을 실행하려고 시도하지 않습니다. 줄의 끝에 있지 않기 때문에 인식합니다.

셸 스크립트가 유닉스 스타일의 줄 끝을 사용하는지 확인하십시오.

3

문제는 스크립트 끝의 CRLF입니다. 쉘 스크립트는 Windows 스타일의 줄 끝을 볼 때이 오류를 발생시킵니다. 셸 스크립트의 줄 끝을 Unix 스타일의 LF로 바꿔야합니다. 각 IDE에는이 작업을 수행하는 고유 한 방법이 있습니다.

Sublime Text 2 ==> View -> Line Endings -> Unix

Notepad++ ==> Edit -> EOL Conversion -> UNIX/OSX Format

일단 변경하고 파일을 저장하면 셸 스크립트는 오류없이 실행되어야합니다.

0

이것은 특별한 문제는 아니지만 if 문 안에 들여 쓰기 된 heredoc을 붙여 탭에서 공백으로 변환 한 경우에도 발생할 수 있습니다. heredoc의 끝 구분 기호는 공백으로 인해 절대로 발견되지 않으며 예기치 않은 파일 끝이 결과입니다.