2012-06-14 34 views
18

Tôi đang viết tập lệnh bash đơn giản này như sau.Mảng Bash: Lỗi cú pháp không mong muốn

#!/bin/bash 

array=(/home/abc/Downloads/something.bat /home/abc/Downloads/smb.conf) 
echo ${array[@]} 

Tôi dự kiến ​​nó sẽ in tất cả tên của tệp trong mảng. Nhưng tôi nhận được lỗi này thay vì:

test.sh: 3: Syntax error: "(" unexpected 

Nếu tôi thay đổi tuyên bố của mảng để

array = {/home/abc/Downloads/something.bat /home/abc/Downloads/smb.conf} 

lỗi này sẽ biến mất nhưng tôi vẫn còn có lỗi mới

test.sh: 3: array: not found 
test.sh: 4: Bad substitution 

Làm thế nào tôi có thể giải quyết vấn đề này? Đây là lần đầu tiên tôi lập trình vỏ nên tôi không thể tự khắc phục được sự cố.

QUYẾT:

Tôi đã thực hiện nó như sh test.sh nhưng tôi quên tôi phải thực hiện nó như bash test.sh

+1

Đó không phải là mảng kết hợp. Đó là một mảng bình thường, được đánh số bằng số. –

+0

@DennisWilliamson Oh Ok. Tôi sẽ chỉnh sửa nó – user1357576

+2

@ user1357576: Đăng giải pháp dưới dạng câu trả lời và đánh dấu nó là chấp nhận, không chỉnh sửa nó thành câu hỏi. Ngoài ra, không chỉnh sửa tiêu đề để giải quyết nó, trang web sẽ đánh dấu câu hỏi là đã được giải quyết khi bạn chấp nhận câu trả lời. – Daenyth

Trả lời

1

bài tập Biến không thể có một không gian xung quanh dấu = :

array=(/a/b/ /c/d) 
    ^--no spaces 

bạn có chắc?

[email protected]:~$ array =(a b)  
bash: syntax error near unexpected token `(' 
[email protected]:~$ array= (a b) 
bash: syntax error near unexpected token `(' 
[email protected]:~$ array = (a b) 
bash: syntax error near unexpected token `(' 
[email protected]:~$ array=(a b) 
[email protected]:~$ echo ${array[1]} 
b 
+0

Không may mắn. Tôi đã loại bỏ các không gian vẫn mang lại cho tôi cú pháp lỗi – user1357576

+0

thú vị khi tôi thực hiện nó trực tiếp trên thiết bị đầu cuối, nó hoạt động.Nhưng khi tôi sử dụng cùng một thứ trong một tập tin, nó không có! – user1357576

+0

@ user1357576: hoạt động tốt ở đây khi tôi đặt ở trên vào một tệp. Tất nhiên, các dòng lỗi cú pháp tiêu diệt kịch bản, nhưng nếu nó chỉ là nhiệm vụ không gian cuối cùng, nó hoạt động tốt. –

0

Con trỏ: Các không gian quan trọng với phân bổ biến trong BASH. Không sử dụng chúng trước hoặc sau dấu bằng.

+0

Tôi hiểu rằng> Tôi đã thực thi các lệnh rất giống nhau trực tiếp trên thiết bị đầu cuối và nó hoạt động. NHƯNG cùng lệnh tôi đưa vào test.sh và thực hiện, họ ném lỗi .. Bạn có biết tại sao không? – user1357576

+0

@ user1357576 Từ bình luận của bạn ở trên, có vẻ như bạn đã học được sự khác biệt giữa 'sh' và' bash'. 'sh' không được bảo đảm là' bash' trong một số môi trường. Thực tế, 'sh' thường được liên kết với các shell hoàn toàn POSIX như' dấu gạch ngang '. –

0

Bạn đang sử dụng trình soạn thảo DOS để tạo tập lệnh của mình phải không?

Vỏ Bash, không thích cặp CRLF, chỉ LF (hoặc \r\n ký tự VS chỉ đơn giản là \n char).

Đặt kịch bản của bạn qua bài kiểm tra này

cat -vet myScript.sh 

Bạn có thấy ký tự '^ M' vào cuối dòng? Nếu đó là một tập tin dos.

Xem nếu hệ thống của bạn đã dos2unix sau đó sử dụng nó như

dos2unix myScript.sh 

Ngoài ra, như nhiều người đã nhận xét về nó, xin vui lòng chỉnh sửa câu hỏi ban đầu của bạn để loại bỏ các khoảng trống xung quanh = dấu hiệu của bạn trong công việc để array.

Tôi hy vọng điều này sẽ hữu ích.

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