Câu trả lời:
Tôi nghĩ rằng file.sh là với các trình kết thúc dòng CRLF.
chạy
dos2unix file.sh
thì vấn đề sẽ được khắc phục.
Bạn có thể cài đặt dos2unix trong ubuntu với cái này:
sudo apt-get install dos2unix
Một điều khác cần kiểm tra (vừa xảy ra với tôi):
Tức là đoạn mã trông có vẻ ngây thơ này sẽ gây ra cùng một lỗi:
die () { test -n "$@" && echo "$@"; exit 1 }
Để làm cho người phân tích cú pháp ngu ngốc hạnh phúc:
die () { test -n "$@" && echo "$@"; exit 1; }
;
câu lệnh Every đang được mong đợi kết thúc bằng ;
cách đặt ở cuối ví dụ: if [ -f ~/.git-completion.bash ]; then . ~/.git-completion.bash fi
sẽ tạo ra lỗi đó, trong khi if [ -f ~/.git-completion.bash ]; then . ~/.git-completion.bash; fi;
sẽ không ... chú ý đến dấu chấm phẩy nhỏ ở cuối, tức là: sau .bash
và fi
.
zsh
người dùng. Trước đây không làm việc trong zsh
nhưng không trong sh
và cũng không bash
. Ước gì tôi có 4 người để tôi có thể đưa ra 4 phiếu ủng hộ này
tôi cũng vừa nhận được thông báo lỗi này do sử dụng sai cú pháp trong một if
mệnh đề
else if
(lỗi cú pháp: kết thúc tệp không mong muốn) elif
(đúng cú pháp)tôi đã gỡ lỗi nó bằng cách bình luận từng bit cho đến khi nó hoạt động
mệnh đề if => fi không đóng cũng sẽ nêu lên điều này
mẹo: sử dụng bẫy để gỡ lỗi, nếu tập lệnh của bạn lớn ...
ví dụ
set -x
trap read debug
unexpected end of file
lỗi sẽ xảy ra ngay sau khi fi
được đánh.
Tôi đã nhận được câu trả lời từ vấn đề tương tự này trên StackOverflow
Mở tệp bằng Vim và thử
:set fileformat=unix
Chuyển đổi phần cuối dòng eh thành phần cuối unix và xem liệu điều đó có giải quyết được vấn đề hay không. Nếu chỉnh sửa trong Vim, nhập lệnh: set fileformat = unix và lưu tệp. Một số trình chỉnh sửa khác có khả năng chuyển đổi kết thúc dòng, chẳng hạn như Notepad ++ hoặc Atom
Xin cảm ơn @lem Citatinger
dos2unix
như câu trả lời được chấp nhận khuyên.
Vì vậy, tôi đã tìm thấy bài đăng này và các câu trả lời không giúp được tôi nhưng tôi đã có thể tìm ra lý do tại sao nó gây ra lỗi cho tôi. Tôi đã có một
cat > temp.txt < EOF
some content
EOF
Vấn đề là tôi đã sao chép đoạn mã trên vào một hàm và vô tình gắn thẻ mã. Cần đảm bảo rằng EOF cuối cùng không được gắn thẻ.
EOF
thụt vào trong bốn khoảng trắng và bash không phân tích cú pháp vì điều đó. Xóa khoảng trắng đã khắc phục sự cố.
Điều này đã xảy ra với tôi khi tôi cố gắng gọi một hàm bằng cách sử dụng parens, ví dụ:
run() {
echo hello
}
run()
nên là:
run() {
echo hello
}
run
CHO CỬA SỔ:
Trong trường hợp của tôi, tôi đang làm việc trên Hệ điều hành Windows và tôi gặp lỗi tương tự khi chạy autoconf.
Sau đó, tôi đã chuyển đổi tệp có chuyển đổi EOL thành Windows (CR LF) như sau:
EDIT -> EOL CONVERSION -> WINDOWS (CR LF)
Tôi đã có thể cắt và dán mã của bạn vào một tệp và nó chạy chính xác. Nếu bạn thực thi nó như thế này, nó sẽ hoạt động:
"File.sh" của bạn:
#!/bin/bash
# june 2011
if [ $# -lt 3 -o $# -gt 3 ]; then
echo "Error... Usage: $0 host database username"
exit 0
fi
Lệnh:
$ ./file.sh arg1 arg2 arg3
Lưu ý rằng "file.sh" phải có thể thực thi được:
$ chmod +x file.sh
Bạn có thể nhận được lỗi đó b / c về cách bạn đang nhập liệu (w / a pipe, củ cà rốt, v.v.). Bạn cũng có thể thử tách điều kiện thành hai:
if [ $# -lt 3 ] || [ $# -gt 3 ]; then
echo "Error... Usage: $0 host database username"
exit 0
fi
Hoặc, vì bạn đang sử dụng bash
, bạn có thể sử dụng cú pháp tích hợp:
if [[ $# -lt 3 || $# -gt 3 ]]; then
echo "Error... Usage: $0 host database username"
exit 0
fi
Và, cuối cùng, tất nhiên bạn có thể chỉ cần kiểm tra xem 3 đối số đã được đưa ra chưa (sạch, duy trì khả năng tương thích của trình bao POSIX):
if [ $# -ne 3 ]; then
echo "Error... Usage: $0 host database username"
exit 0
fi
Tôi vừa cắt và dán ví dụ của bạn vào một tệp; nó chạy tốt dưới bash. Tôi không thấy có vấn đề gì với nó.
Để có biện pháp tốt, bạn có thể muốn đảm bảo nó kết thúc bằng một dòng mới, mặc dù bash không nên quan tâm. (Nó chạy cho tôi cả có và không có dòng mới cuối cùng.)
Đôi khi bạn sẽ thấy các lỗi lạ nếu bạn đã vô tình nhúng một ký tự điều khiển vào tệp. Vì đó là một tập lệnh ngắn, hãy thử tạo một tập lệnh mới bằng cách dán nó từ câu hỏi của bạn tại đây trên StackOverflow hoặc chỉ cần nhập lại.
Bạn đang sử dụng phiên bản bash nào? ( bash --version
)
Chúc may mắn!
Đảm bảo rằng tên của thư mục chứa tệp .sh không có ký tự khoảng trắng. Ví dụ: Giả sử nếu nó nằm trong một thư mục có tên là 'Thư mục Mới', thì bạn chắc chắn sẽ gặp phải lỗi mà bạn đã trích dẫn. Thay vào đó, chỉ cần đặt tên nó là 'New_Folder'. Tôi hi vọng cái này giúp được.
Tôi biết tôi đã đến quá muộn trong bữa tiệc. Hy vọng điều này có thể giúp một ai đó.
Kiểm tra tệp .bashrc của bạn. Có lẽ đổi tên hoặc di chuyển nó.
Thảo luận ở đây: Không thể tìm nguồn một tập lệnh bash đơn giản
Trong trường hợp của tôi, có thừa \
trong những thứ tương tự như sau:
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
}
Có KHÔNG một \
vào cuối nămDATA.PATH_PREFIX ./afs/kinetics400