`Lỗi cú pháp: Bắt (xông bất ngờ 'khi tạo một mảng


37

Tôi có hai máy chủ Linux (Debian). Tôi đang tạo một kịch bản shell.

Trên cái đầu tiên tôi tạo một mảng như vậy:

#!/bin/bash
target_array=(
    "/home/user/direct/filename -p123 -r"
)

Điều đó làm việc tốt. Nhưng khi tôi chạy nó trên máy chủ khác, tôi nhận được:

Syntax error: "(" unexpected

Theo như tôi có thể nói cả hai máy chủ đều giống nhau. Bất cứ ai cũng có thể làm sáng tỏ lý do tại sao điều này không hoạt động?

Nếu tôi gõ nó vào thiết bị đầu cuối trực tiếp thì ổn chứ ??


Nó sẽ xuất hiện khi tôi chạy nó như

sh scriptname.sh

Tôi nhận được lỗi, nhưng nếu tôi chạy nó như

./scriptname.sh

nó có vẻ ổn Có gì khác biệt?


Bạn đã sao chép tập lệnh giữa hai máy chủ? thử cat -v <script>xem có char giả không.
LilloX

2
shkhông phải bashvà vì vậy chạy nó sh scriptname.shlà sai
Eric Renouf

Câu trả lời:


56

Khi bạn sử dụng ./scriptname.shnó sẽ thực thi /bin/bashnhư trong dòng đầu tiên với #!. Nhưng khi bạn sử dụng sh scriptname.shnó thực thi sh, không bash.

Các shvỏ không có cú pháp để tạo mảng, nhưng Bash có cú pháp bạn sử dụng.


OK, điều đó có ý nghĩa bây giờ. Như bạn có thể nói tôi khá mới đối với Linux (hiện đang cố gắng chuyển đổi tập lệnh shell / bash Powershell của tôi). Tôi sẽ gắn bó với việc sử dụng ./từ bây giờ. chúc mừng
IGGt

Điều đó không nhất thiết, nhưng phải có sự phối hợp giữa #!/bin/shsh script.sh(hoặc #!/bin/bashbash script.sh)
Konstantin Morenko

3
Ngôn ngữ sh không có mảng ( a[index]=xhoặc a=(x y)). Một số trình thông dịch sh hỗ trợ mảng, chỉ ksh88 (không được chuyển sang Linux AFAIK) và một số biến thể pdksh cũ hơn sẽ hỗ trợ a[index]=valuevà không a=(x y). Trên Debian, shthường dashkhông có hỗ trợ mảng ( a[index]=xsẽ không hoạt động).
Stéphane Chazelas

1
Tôi có thể chết từng mảnh từ bây giờ! :)
Paulo

0

Việc chạy ./scriptname.shsẽ dẫn đến việc đọc dòng đầu tiên của tệp và thấy rằng nó cần chạy ắc / bin / bash, và chuyển phần còn lại của tập lệnh cho trình thông dịch, trong khi thực thi sh scriptname.shsẽ chuyển tệp vào trình bao chuẩn của người dùng (ví dụ: Ash) và là trường hợp mà trình thông dịch khác không hỗ trợ mảng như Bash.


1
shkhông nhất thiết phải là "vỏ tiêu chuẩn của người dùng", nó thường là tệp thực thi (hoặc liên kết tượng trưng) của chính nó và shsẽ được gọi để xử lý tập lệnh. Điều đó sẽ đúng nếu ngay cả khi vỏ đăng nhập mặc định cho người dùng đó làbash
Eric Renouf

Đó là phần mà tôi không hoàn toàn chắc chắn vào lúc này. Cảm ơn bạn đã làm rõ!
dave_alcarin

0

Với sh scriptname.sh, bạn đang chạy nó với sh, không nhất thiết phải với bash. Hãy thử so sánh sh --versiontrên cả hai máy. Và / hoặc với dpkg -S $(which sh).


Ngay cả khi shmột liên kết tượng trưng đến bashnó sẽ hoạt động khác đi khi được gọi làsh
Eric Renouf
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.