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
'programing' 카테고리의 다른 글
| bash curl 문에 '&' 문자를 포함하는 방법 (0) | 2023.04.21 |
|---|---|
| "이 응용 프로그램은 백그라운드 스레드에서 자동 레이아웃 엔진을 수정하고 있습니다" 오류가 표시됩니까? (0) | 2023.04.21 |
| 개체 ID를 가진 클라이언트에 'Microsoft' 작업을 수행할 수 있는 권한이 없습니다.Data Factory / 데이터 팩토리 / 데이터 라인 / 읽기' 범위 초과 (0) | 2023.04.21 |
| 스레드 세이프 Collection View는 어디서 구할 수 있나요? (0) | 2023.04.21 |
| Excel에서 웹 페이지로 복사/붙여넣기 (0) | 2023.04.21 |