programing

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

mbctv 2023. 4. 21. 21:19
반응형

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

죄송하지만 이건 배쉬어로 된 아주 간단한 대본입니다.코드는 다음과 같습니다.

#!/bin/bash
# june 2011

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

sh 파일을 실행한 후.sh:

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

파일인 것 같아요.sh는 CRLF 회선 터미네이터를 사용합니다.

달려.

dos2unix file.sh

그러면 문제가 해결될 거예요.

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

sudo apt-get install dos2unix

확인해야 할 다른 사항(방금 생각났을 때):

  • 한 줄 함수의 본문을 세미콜론으로 끝낸다.

즉, 이 순수해 보이는 스니펫이 같은 에러를 일으킵니다.

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

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

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

이, 이 에러메시지를 잘못 요.if 삭제

  • else if치 않은 끝)(오류: " " " " " )
  • elif 구문 (구문)

나는 동작할 때까지 비트를 코멘트하여 디버깅했다

=> fi 절이 이 문제를 제기할 경우 닫히지 않음

힌트: 트랩을 사용하여 디버깅합니다.스크립트가 크면...

예.

set -x
trap read debug

답변은 StackOverflow와 유사한 문제에서 얻었습니다.

Vim에서 파일을 열고 시도합니다.

:set fileformat=unix

eh 행의 엔딩을 unix 엔딩으로 변환하여 문제가 해결되는지 확인합니다.Vim에서 편집하는 경우 명령어:set fileformat=set을 입력하고 파일을 저장합니다.다른 에디터 중에는 메모장++나 Atom과 같은 줄 끝을 변환할 수 있는 기능이 있는 것도 있습니다.

감사합니다 @lemongrassnginger

예를 들어 parens를 사용하여 함수를 호출하려고 할 때 이 문제가 발생했습니다.

run() {
  echo hello
}

run()

다음 항목이어야 합니다.

run() {
  echo hello
}

run

if - fi 문구를 한 줄에 쓸 때 문제가 있었습니다.

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

여러 줄 쓰기를 통해 문제를 해결했습니다.

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

그래서 저는 이 글을 찾았고 답변은 도움이 되지 않았지만 왜 오류가 발생했는지 알 수 있었습니다.저는 한 잔 했다.

cat > temp.txt < EOF
some content
EOF

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

sygwin에 필요:-

 export SHELLOPTS
 set -o igncr

.syslog_profile 에 있습니다.이렇게 하면 unix2dos를 실행할 필요가 없습니다.

Windows의 경우:

제 경우 Windows OS에서 작업 중 autoconf 실행 중 동일한 오류가 발생하였습니다.

  • 메모장++ IDE로 configure.ac 파일을 열기만 하면 됩니다.
  • 그런 다음 다음과 같이 EOL 변환 파일을 Windows(CR LF)로 변환했습니다.

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

함수 정의에서 닫힘 괄호를 놓치면 방금 발견한 것처럼 이 오류가 발생합니다.

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

물론 이런 식이어야 하는데...

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

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

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가 표시될 수 있습니다.조건을 2개로 분할할 수도 있습니다.

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

제 경우, 중복되는 것이 있습니다.\다음과 같은 경우:

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
}

없습니다.\의 마지막에DATA.PATH_PREFIX ./afs/kinetics400

dos2unix가 설치되어 있지 않은(설치하고 싶지 않은) 사용자:

후행 제거\r다음 에러의 원인이 되는 문자:

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

이 Stack Overflow 응답의 상세.정말 도움이 됐어요.https://stackoverflow.com/a/32912867/7286223

방금 당신의 예제를 파일에 오려 붙였어요. bash에서 잘 작동했어요.문제없다고 생각합니다.

bash는 신경 쓰지 않아도 되지만, 좋은 방법으로 새 행으로 끝나는 것이 좋습니다(최종 새 행이 있든 없든 상관없습니다.

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

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

행운을 빕니다.

.sh 파일이 있는 디렉토리 이름에 공백 문자가 없는지 확인합니다.예: 'New Folder'라는 폴더에 있는 경우 인용한 오류가 발생합니다.대신 'New_Folder'로 이름을 붙입니다.이게 도움이 됐으면 좋겠어요.

스크립트의 마지막 줄에 줄바꿈이 없는 경우에도 셸의 일부 버전에서는 이 메시지가 출력될 수 있습니다.

Ubuntu의 경우:

$ gedit ~/.profile

그리고나서,File -> Save as및 세트end line로.Unix/Linux

파티에 너무 늦은 거 알아.이게 누군가에게 도움이 되길 바라.

.bashrc 파일을 확인합니다.이름을 바꾸거나 이동합니다.

여기에서 설명: 단순 bash 스크립트를 소스할없습니다.

MacOS를 사용하는 사용자의 경우:

Windows 형식의 파일을 받아 MacOS에서 실행하려는 경우 이 오류가 나타나면 다음 명령을 실행합니다.

brew install dos2unix
sh <file.sh>

스크립트 자체가 유효하고 구문 오류가 없는 경우 다음과 같은 원인이 있을 수 있습니다.

  • 하지 않은 엔드 라인 " " )\r\n\n)
  • byte order mark파일 선두에 있는 (BOM)

다 , 하다, 하다, 하다, 하다를 해서 고칠 수 요.vim ★★★★★★★★★★★★★★★★★」vi.

행 끝을 수정하려면 vim에서 파일을 열고 명령 모드에서 다음과 같이 입력합니다.

:set ff=unix

BOM을 삭제하려면:

:set nobomb

언급URL : https://stackoverflow.com/questions/6366530/bash-syntax-error-unexpected-end-of-file

반응형