[bash] Bash 구문 오류 : 예기치 않은 파일 끝

이것은 Bash의 매우 간단한 스크립트입니다. 코드는 다음과 같습니다.

#!/bin/bash
# june 2011

if [ $# -lt 3 -o $# -gt 3 ]; then
   echo "Error... Usage: $0 host database username"
   exit 0
fi

sh file.sh를 실행 한 후 :

구문 오류 : 예기치 않은 파일 끝



답변

file.sh에는 CRLF 줄 종결자가 있다고 생각합니다.

운영

dos2unix file.sh

그러면 문제가 해결됩니다.

다음과 같이 우분투에 dos2unix를 설치할 수 있습니다.

sudo apt-get install dos2unix


답변

확인해야 할 또 다른 사항은 다음과 같습니다.

  • 세미콜론으로 한 줄 함수의 본문을 종료합니다.

즉,이 순진한 스 니펫은 동일한 오류를 발생시킵니다.

die () { test -n "$@" && echo "$@"; exit 1 }

멍청한 파서를 행복하게 만들려면 :

die () { test -n "$@" && echo "$@"; exit 1; }


답변

또한 if절 에서 잘못된 구문을 사용 하여이 오류 메시지를 받았습니다.

  • else if (구문 오류 : 예기치 않은 파일 끝)
  • elif (올바른 구문)

작동 할 때까지 비트를 주석 처리하여 디버깅했습니다.


답변

닫히지 않은 if => fi 절도 이것을 발생시킵니다.

팁 : 스크립트가 큰 경우 트랩을 사용하여 디버그하십시오.

예 :

set -x
trap read debug


답변

StackOverflow의 비슷한 문제 에서이 답변을 얻었습니다.

Vim에서 파일을 열고

:set fileformat=unix

eh 라인 엔딩을 유닉스 엔딩으로 변환하고 문제가 해결되는지 확인하십시오. Vim에서 편집하는 경우 : set fileformat = unix 명령을 입력하고 파일을 저장합니다. 다른 여러 편집기는 Notepad ++ 또는 Atom과 같은 줄 끝을 변환하는 기능이 있습니다.

감사합니다 @lemongrassnginger


답변

cygwin에서 나는 다음이 필요했습니다.

 export SHELLOPTS
 set -o igncr

.bash_profile. 이렇게하면 unix2dos를 실행할 필요가 없었습니다.


답변

그래서 나는이 게시물을 찾았고 답변이 도움이되지 않았지만 왜 오류가 발생했는지 알아낼 수있었습니다. 나는

cat > temp.txt < EOF
some content
EOF

문제는 위의 코드를 함수에 복사하고 실수로 코드를 탭한 것입니다. 마지막 EOF가 탭으로되어 있지 않은지 확인해야합니다.