2013-08-21 38 views
13

Bất kỳ ý tưởng nào về vấn đề có thể là gì?Lỗi cú pháp BASH gần mã thông báo không mong muốn 'đã hoàn tất'

Mã của tôi là:

#!/bin/bash 
while : 
do 
echo "Press [CTRL+C] to stop.." 
sleep 1 
done 

lưu nó như sh và chạy bash file.sh

CentOS 6 32-bit

vấn đề này là gì? Lần đầu tiên EVER sử dụng BASH, cần nó cho một vòng lặp vô hạn đơn giản trên một cái gì đó.

+1

Mã của bạn là chính xác và hoạt động cho tôi bằng cách sử dụng ubuntu. Mã trên có phải là bản sao chép chính xác không? Đầu ra 'file file.sh' là gì? –

+2

Vấn đề là gì? Nó chạy nhưng không hoạt động đúng không? Nó có chạy không? Nó có cung cấp cho bạn một số thông điệp không? Những chú ngựa paisley diễu hành quanh nhà bếp của bạn? – twalberg

+3

@twalberg: Thông báo lỗi (tôi giả định) nằm trong tiêu đề. –

Trả lời

17

Chạy cat -v file.sh.

Bạn có nhiều khả năng có trở về vận chuyển hoặc không có khoảng trống trong tệp của mình. cat -v sẽ hiển thị chúng tương ứng là ^MM-BM- hoặc M-. Nó cũng tương tự sẽ hiển thị bất kỳ ký tự lạ khác mà bạn có thể đã nhận được vào tập tin của bạn.

Tháo ngắt dòng Windows với

tr -d '\r' file.sh > fixedfile.sh 
3

lỗi mà bạn đang nhận được là gì?

$ bash file.sh 
test.sh: line 8: syntax error: unexpected end of file 

Nếu bạn gặp lỗi đó, bạn có thể có kết thúc dòng không hợp lệ. Unix sử dụng <LF> ở cuối tệp trong khi Windows sử dụng <CR><LF>. Nhân vật <CR> được hiểu là ký tự.

Bạn có thể sử dụng od -a test.sh để xem vô hình ký tự trong tệp.

$ od -a test.sh 
0000000 # ! / b i n / b a s h cr nl # sp cr 
0000020 nl w h i l e sp : cr nl d o cr nl sp sp 
0000040 sp sp e c h o sp " P r e s s sp [ C 
0000060 T R L + C ] sp t o sp s t o p " cr 
0000100 nl sp sp sp sp s l e e p sp 1 cr nl d o 
0000120 n e cr nl             
0000124 

Các sp đứng cho không gian, các ht đứng cho tab, cr đứng cho <CR>nl đứng cho <LF>. Lưu ý rằng tất cả các dòng kết thúc bằng cr theo sau là một ký tự nl.

Bạn cũng có thể sử dụng cat -v test.sh nếu lệnh cat của bạn có tham số -v.

Nếu bạn có dos2unix vào máy của bạn, bạn có thể sử dụng lệnh đó để sửa chữa tập tin của bạn:

$ dos2unix test.sh 
1

mở tập tin mới có tênfoobar

nano -w foobar 

kịch bản Input

#!/bin/bash 
while [ 0 = 0 ]; do 
    echo "Press [CTRL+C] to stop.." 
    sleep 1 
done; 

Thoát và lưu

CTRL + X sau đó YNhập

Set kịch bản thực thi và chạy

chmod +x foobar 
./foobar 
0

Chỉnh sửa mã của bạn trong bất kỳ linux môi trường thì bạn sẽ không phải đối mặt với điều này vấn đề. Nếu chỉnh sửa trong cửa sổ notepad thì mọi không gian sẽ mất nó dưới dạng^M.

0

Tôi có cùng một vấn đề như trên và đã cho tôi cả ngày để phát hiện ra rằng nó không giống như cách tiếp cận dòng mới của tôi. Thay vào đó tôi sử dụng lại cùng một mã với phương pháp bán kết tràng thay thế. Ví dụ mã ban đầu của tôi bằng cách sử dụng dòng mới (mà ném những lỗi tương tự như của bạn):

Y=1 
while test "$Y" -le "20" 
do 
     echo "Number $Y" 
     Y=$[Y+1] 
done 

Và sử dụng mã với cách tiếp cận dấu chấm phẩy với kỳ quan làm việc:

Y=1 ; while test "$Y" -le "20"; do echo "Number $Y"; Y=$[Y+1] ; done 

tôi nhận thấy vấn đề tương tự xảy ra cho các lệnh khác cũng như sử dụng cách tiếp cận dòng mới, vì vậy tôi nghĩ rằng tôi sẽ dính vào việc sử dụng dấu chấm phẩy cho mã tương lai của tôi.

+0

Nếu các dòng mới là vấn đề, có lẽ bạn nên 'dos2unix' tệp vì nó chứa các dòng mới của Windows. –

1

Có thể giúp đỡ người khác: Tôi đã gặp phải cùng một loại vấn đề trong khi tôi đã thực hiện một số "sao chép-dán" từ một tài liệu Microsoft Word, nơi tôi ghi chú vào kịch bản lệnh shell của tôi.

Viết lại, theo cách thủ công, cùng mã chính xác trong tập lệnh vừa giải quyết vấn đề này.

Ban đầu, điều này khá khó hiểu, tôi nghĩ rằng các ký tự và/hoặc định dạng ẩn của Word là vấn đề. Rõ ràng nhưng không thể nhìn thấy ... Tôi mất khoảng một giờ về điều này (tôi không có chuyên gia vỏ, như bạn có thể đoán ...)

8

Tôi đã nhận được lỗi tương tự trên Cygwin; Tôi đã làm như sau (một trong số họ cố định nó):

  1. Chuyển Đổi TABS để SPACES
  2. chạy dos2unix vào file .(ba)sh
+0

Không cần phải chuyển đổi tab sang không gian. –

+0

@KeithThompson - Tôi cho rằng dòng kết thúc bằng DOS là lý do cho lỗi –

0

Có một cách bạn có thể nhận vấn đề này mà không gặp vấn đề xuống dòng hỗn hợp (ít nhất, trong vỏ của tôi, đó là GNU bash v4.3.30):

#!/bin/bash 
# foo.sh 

function foo() { 
    echo "I am quoting a thing `$1' inside a function." 
} 

while [ "$input" != "y" ]; do 
    read -p "Hit `y' to continue: " -n 1 input 
    echo 
done 

foo "What could possibly go wrong?" 
$ ./foo.sh 
./foo.sh: line 11: syntax error near unexpected token `done' 
./foo.sh: line 11: `done' 

Điều này là do bash mở rộng backticks bên trong chuỗi dụng dấu ngoặc kép (xem hướng dẫn bash trên quotingcommand substitution), và trước khi tìm một backtick phù hợp, sẽ giải thích bất kỳ dấu ngoặc kép như một phần của lệnh thay thế:

$ echo "Command substitution happens inside double-quoted strings: `ls`" 
Command substitution happens inside double-quoted strings: foo.sh 
$ echo "..even with double quotes: `grep -E "^foo|wrong" foo.sh`" 
..even with double quotes: foo "What could possibly go wrong?" 

Bạn có thể giải quyết vấn đề này bằng cách thoát chuỗi sau bằng dấu gạch chéo ngược hoặc bằng cách sử dụng chuỗi được trích dẫn một lần.

Tôi không thực sự chắc chắn tại sao điều này chỉ đưa ra thông điệp một lỗi, nhưng tôi nghĩ rằng nó đã làm với định nghĩa hàm:

#!/bin/bash 
# a.sh 

function a() { 
    echo "Thing's `quoted'" 
} 
a 
while true; do 
    echo "Other `quote'" 
done 
#!/bin/bash 
# b.sh 

echo "Thing's `quoted'" 
while true; do 
    echo "Other `quote'" 
done 
$ ./a.sh 
./a.sh: line 10: syntax error near unexpected token `done' 
./a.sh: line 10: `done' 
$ ./b.sh 
./b.sh: command substitution: line 6: unexpected EOF while looking for matching `'' 
./b.sh: command substitution: line 9: syntax error: unexpected end of file 
Thing's quote' 
./b.sh: line 7: syntax error near unexpected token `done' 
./b.sh: line 7: `done' 
+0

Tôi biết điều này không trả lời đúng câu hỏi, nhưng vì đây là kết quả đầu tiên của google cho "bash syntax error near unexpected token done", Tôi tưởng tượng điều này sẽ vẫn hữu ích đối với một số người. – charliegreen

1

Đôi khi lỗi này xảy ra vì các ký tự CR bất ngờ trong tệp, thường là do tệp được tạo trên hệ thống Windows sử dụng kết thúc dòng CR. Bạn có thể khắc phục điều này bằng cách chạy os2unix hoặc tr, ví dụ:

tr -d '\ 015' < yourscript.sh> newscript.sh

này loại bỏ bất kỳ ký tự CR từ tập tin.

Các vấn đề liên quan