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


99

이것은 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를 실행 한 후 :

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

답변:


137

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

운영

dos2unix file.sh

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

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

sudo apt-get install dos2unix

이 문제의 원인은 무엇입니까? 저는 보통 Windows에서 작업하지만 스크립트를 유닉스 시스템으로 전송해야합니다.
CMCDragonkai 2013

Windows의 줄 바꿈은 "\ r \ n"이고 Linux에서는 "\ n"입니다.
clyfish 2013

8
@KeesdeKooter 나는 무언가가 당신을 위해 작동하지 않는다고 말하지 않을 것입니다. 그것은 나를 위해 작동하지 않은 간단한 것으로 충분합니다. 그래서 문제에 대한 여러 솔루션이있을 수 있기 때문에 질문에 대한 여러 답변을 허용했습니다.
Jeff Wilbert

2
메모장 ++ 편집기 편집> EOL 변환> Old Mac 형식을 사용하여 해결했습니다.
raktale

Notepad ++로 bash 파일을 편집 할 수있는 경우. 편집-> EOL 변환-> Macintosh (CR)로 이동합니다. Windows OS를 사용하는 경우에도 Macintosh (CR)로 변경하십시오.
Juniar

127

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

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

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

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

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

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

3
+1 다음과 같이 대괄호가있는 코드 스 니펫에도 적용됩니다. [[ "$ #"== 1]] && [[ "$ arg"== [1,2,3,4]]] && printf "% s \ n ""이런 "|| {printf "% s \ n" "blahblah"; 용법; } ............ 이전에 정의 된 일부 함수 'usage'를 호출 한 직후에 구불 구불 한 괄호 안에 세미콜론이 있음을 유의하십시오. 그것을 잊어 버리면 동일한 구문 오류가 발생합니다. 예기치 않은 eof.
Cbhihe

니가 끝냈어. 사실 간단한 것은 ;Every 문이 끝날 것으로 예상 ;된다는 if [ -f ~/.git-completion.bash ]; then . ~/.git-completion.bash fi것입니다 . 예를 들어 : 오류가 발생하지만 if [ -f ~/.git-completion.bash ]; then . ~/.git-completion.bash; fi;... 끝에 작은 세미콜론이 있음을 알 수 없습니다. 예 : after .bashand fi.
Emmanuel Mahuni

1
zsh사용자 가 나와 공유 한 스크립트에 이것을 포함했습니다 . 전자는에서 작동 zsh하지만 에서는 작동하지 sh않습니다 bash. 나는이 4 upvotes을 줄 수 있도록 소원 나는 4 명의 사람들은이었다
다 보스

42

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

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

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


정말 감사합니다 ..
누군가이

17

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

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

예 :

set -x
trap read debug

1
나는 정확히 "fi"를 잊었다! 감사합니다 :) 가능하다면 모두의 이익을 위해 트랩 사용 팁에 대해 조금 자세히 설명하십시오.
Carles Alcolea

3
지연되어 죄송합니다, 친구. '트랩'명령은 본질적으로 모든 줄을 중단하여 스크립트를 디버깅하는 방법입니다. 풀러 토론은 여기에 있습니다 : stackoverflow.com/questions/9080431/...
theRiley

1
감사합니다. 있습니다 unexpected end of file오류가 즉시이 발생할 것이다 fi맞았다.
Stephane B.

8

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

Vim에서 파일을 열고

:set fileformat=unix

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

감사합니다 @lemongrassnginger


이것은 dos2unix수락 된 답변이 조언 하는 대로 수행 할 수있는 대체 방법 입니다.
ulidtko

7

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

 export SHELLOPTS
 set -o igncr

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


6

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

cat > temp.txt < EOF
some content
EOF

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


1
이것이 바로 제 경우였습니다. 나는 EOF네 개의 공백으로 들여 쓰기했고 bash는 그 때문에 그것을 구문 분석하지 않았습니다. 공백을 제거하면 문제가 해결되었습니다.
aexl

5

한 줄에 "if-fi"문을 작성할 때 문제가있었습니다.

if [ -f ~/.git-completion.bash ]; then . ~/.git-completion.bash fi

내 문제를 해결 한 여러 줄 쓰기 :

if [ -f ~/.git-completion.bash ]; then 
    . ~/.git-completion.bash
 fi

3

괄호를 사용하여 함수를 호출하려고 할 때 이런 일이 발생했습니다.

run() {
  echo hello
}

run()

해야한다:

run() {
  echo hello
}

run

2

WINDOWS의 경우 :

제 경우에는 Windows OS에서 작업 중이었고 autoconf를 실행하는 동안 동일한 오류가 발생했습니다.

  • NOTEPAD ++ IDE로 configure.ac 파일을 엽니 다 .
  • 그런 다음 File with EOL 변환을 Windows (CR LF) 로 다음과 같이 변환했습니다 .

    편집-> EOL 변환-> WINDOWS (CR LF)


1

코드를 잘라내어 파일에 붙여 넣을 수 있었고 올바르게 실행되었습니다. 다음과 같이 실행하면 작동합니다.

귀하의 "file.sh":

#!/bin/bash
# june 2011

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

명령 :

$ ./file.sh arg1 arg2 arg3

"file.sh"는 실행 가능해야합니다.

$ chmod +x file.sh

입력을 수행하는 방법 (파이프, 당근 등)에 대한 오류 b / c가 표시 될 수 있습니다. 조건을 두 가지로 나눌 수도 있습니다.

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

또는을 사용 bash하고 있으므로 기본 제공 구문을 사용할 수 있습니다.

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

그리고 마지막으로, 3 개의 인수가 주어 졌는지 확인할 수 있습니다 (깨끗하고 POSIX 셸 호환성 유지).

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

나는 여전히 같은 오류가 있습니다. 코드가 어디로 가는지 정확히 확인 메신저 잘못된
markcruz

이상합니다. 코드를 잘라내어 붙여 넣었는데 예상대로 작동했습니다. 더 이상 오류 출력이 있었습니까? 많은 시간 동안 bash는 줄 번호를 나열합니다. 또한 어떤 시스템을 실행하고 있습니까? (Linux, MacOS, BSD, distro 등)
aaronstacy 2011-06-16

1

함수 정의에 닫는 중괄호가 없으면 방금 발견 한이 오류가 발생합니다.

function whoIsAnIidiot() {
    echo "you are for forgetting the closing brace just below this line !"

당연히 이러 야 ...

function whoIsAnIidiot() {
    echo "not you for sure"
}

0

방금 예제를 잘라내어 파일에 붙여 넣었습니다. bash에서 잘 실행되었습니다. 나는 그것에 어떤 문제도 보지 않는다.

좋은 측정을 위해 bash는 신경 쓰지 않아도되지만 개행으로 끝나는 것을 원할 수 있습니다. (마지막 줄 바꿈이 있든 없든 나에게 모두 실행됩니다.)

실수로 파일에 제어 문자를 삽입 한 경우 이상한 오류가 표시되는 경우가 있습니다. 짧은 스크립트이므로 여기에 질문의 내용을 StackOverflow에 붙여 넣거나 간단히 다시 입력하여 새 스크립트를 만들어보십시오.

어떤 버전의 bash를 사용하고 있습니까? ( bash --version)

행운을 빕니다!


0

.sh 파일이있는 디렉토리 이름에 공백 문자가 없는지 확인하십시오. 예 : '새 폴더'라는 폴더에있는 경우 인용 한 오류가 발생할 수 있습니다. 대신 'New_Folder'로 이름을 지정하십시오. 이게 도움이 되길 바란다.


0

분명히 일부 버전의 셸은 스크립트의 마지막 줄에 줄 바꿈이 없을 때이 메시지를 내보낼 수도 있습니다.


0

Ubuntu에서 :

$ gedit ~/.profile

그런 다음, File -> Save as및 설정 end lineUnix/Linux



0

MacOS 사용자 :

Windows 형식의 파일을 받았는데 MacOS에서 실행하고 싶었는데이 오류가 표시되면 다음 명령을 실행하십시오.

brew install dos2unix
sh <file.sh>

0

제 경우에는 \다음과 같은 중복 이 있습니다.

function foo() {
    python tools/run_net.py \
                           --cfg configs/Kinetics/X3D_8x8_R50.yaml \
                           NUM_GPUS 1 \
                           TRAIN.BATCH_SIZE 8 \
                           SOLVER.BASE_LR 0.0125 \
                           DATA.PATH_TO_DATA_DIR ./afs/kinetics400 \
                           DATA.PATH_PREFIX  ./afs/kinetics400  \  # Error
}

NOT\ 의 끝에서DATA.PATH_PREFIX ./afs/kinetics400

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.