이것은 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; }
;
Every 문이 끝날 것으로 예상 ;
된다는 if [ -f ~/.git-completion.bash ]; then . ~/.git-completion.bash fi
것입니다 . 예를 들어 : 오류가 발생하지만 if [ -f ~/.git-completion.bash ]; then . ~/.git-completion.bash; fi;
... 끝에 작은 세미콜론이 있음을 알 수 없습니다. 예 : after .bash
and fi
.
zsh
사용자 가 나와 공유 한 스크립트에 이것을 포함했습니다 . 전자는에서 작동 zsh
하지만 에서는 작동하지 sh
않습니다 bash
. 나는이 4 upvotes을 줄 수 있도록 소원 나는 4 명의 사람들은이었다
닫히지 않은 if => fi 절도 이것을 발생시킵니다.
팁 : 스크립트가 큰 경우 트랩을 사용하여 디버그하십시오.
예 :
set -x
trap read debug
unexpected end of file
오류가 즉시이 발생할 것이다 fi
맞았다.
StackOverflow의 비슷한 문제 에서이 답변을 얻었습니다.
Vim에서 파일을 열고
:set fileformat=unix
eh 라인 엔딩을 유닉스 엔딩으로 변환하고 문제가 해결되는지 확인하십시오. Vim에서 편집하는 경우 : set fileformat = unix 명령을 입력하고 파일을 저장합니다. 다른 여러 편집기는 Notepad ++ 또는 Atom과 같은 줄 끝을 변환하는 기능이 있습니다.
감사합니다 @lemongrassnginger
dos2unix
수락 된 답변이 조언 하는 대로 수행 할 수있는 대체 방법 입니다.
코드를 잘라내어 파일에 붙여 넣을 수 있었고 올바르게 실행되었습니다. 다음과 같이 실행하면 작동합니다.
귀하의 "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
방금 예제를 잘라내어 파일에 붙여 넣었습니다. bash에서 잘 실행되었습니다. 나는 그것에 어떤 문제도 보지 않는다.
좋은 측정을 위해 bash는 신경 쓰지 않아도되지만 개행으로 끝나는 것을 원할 수 있습니다. (마지막 줄 바꿈이 있든 없든 나에게 모두 실행됩니다.)
실수로 파일에 제어 문자를 삽입 한 경우 이상한 오류가 표시되는 경우가 있습니다. 짧은 스크립트이므로 여기에 질문의 내용을 StackOverflow에 붙여 넣거나 간단히 다시 입력하여 새 스크립트를 만들어보십시오.
어떤 버전의 bash를 사용하고 있습니까? ( bash --version
)
행운을 빕니다!
.sh 파일이있는 디렉토리 이름에 공백 문자가 없는지 확인하십시오. 예 : '새 폴더'라는 폴더에있는 경우 인용 한 오류가 발생할 수 있습니다. 대신 'New_Folder'로 이름을 지정하십시오. 이게 도움이 되길 바란다.
나는 내가 파티에 너무 늦었다는 것을 안다. 이것이 누군가를 도울 수 있기를 바랍니다.
.bashrc 파일을 확인하십시오. 이름을 바꾸거나 이동할 수 있습니다.
여기에서 토론 : 간단한 bash 스크립트를 소싱 할 수 없습니다 .
제 경우에는 \
다음과 같은 중복 이 있습니다.
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