Lỗi Shell Script khi sử dụng Cygwin


0

Tôi đã nhận được lỗi này sau khi thực hiện kịch bản shell như dưới đây.

$ ./script_test.sh
./script_test.sh: line 3: syntax error near unexpected token `$'do\r''
'/script_test.sh: line 3: `for ((j=0; j<"$N"; j++)) ; do

Kịch bản dưới đây

#!/bin/sh

# This script will launch 10 simulations for each value of the PARAM1_LIST.
# Simulations results will be stored in folders named "myTest-i-j", where i
# is the effective value of the PARAM1_LIST for each simulation and j
# is the 1 to 10 repetition for each i.

N=10
PARAM1_LIST=(1 2 5 10)

for (( j = 0 ; j < $N; j++ )); do
for i in ${PARAM1_LIST[@]}; do
java -jar N3Sim.jar myConfigFile.cfg myTest-${i}-${j} $i
done
done

Khó có thể nói do định dạng trên, nhưng có vẻ như bạn có thể cần #!/bin/shthay vì !/bin/sh?
Kent

OP dường như đã viết một shebang đầy đủ, nhưng đánh dấu đã ăn băm.
Hennes

Lỗi chính xác là gì?
Journeyman Geek

Bạn có thể thêm một dòng set -xbên dưới shebang để có thêm thông tin gỡ lỗi.
Hennes

Ngoài ra, tôi nhận thấy và lỗi gần $'do\r. Đó \rlà một dòng mới . Có thể dòng đó đã được viết hoặc sao chép từ một nơi có các kết thúc dòng khác mà thông dịch viên của bạn mong đợi.
Hennes

Câu trả lời:


0

Tập lệnh của bạn chứa các dòng mới của DOS CR LFthay vì các dòng Unix LF. $'\r'là một chuỗi thoát bash cho CRký tự điều khiển thường không có trong các tệp văn bản Unix. Đó là ở cuối dòng 3, bây giờ là dòng 11 vì có lẽ bạn đã thêm chuỗi shebang và nhận xét sau đó.

Giải pháp là chuyển đổi các dòng mới:

dos2unix script_test.sh

Ngoài ra, xin lưu ý rằng tập lệnh đang sử dụng cấu trúc bash của mảng và shebang phải là #!/bin/bash.


Cảm ơn câu trả lời. Tôi chỉ cần chuyển đổi tập lệnh sang định dạng unix bằng cygwin. Tất cả mọi thứ tôi đặt trong thẻ băm chỉ là một lời giải thích đơn giản cho những gì tôi đang cố gắng làm.
leepyron

@ ngủyron Tôi hoàn toàn không hiểu bình luận của bạn. Bạn có thể chuyển đổi tệp tập lệnh của mình bằng dos2unixtiện ích (như được hiển thị trong câu trả lời) là một phần của Cygwin . Nếu vì bất kỳ lý do gì bạn không thể cài đặt dos2unixgói, bạn có thể sử dụng ví dụ sed 's/\r//' script_test.sh >script_test-converted.shhoặc tr -d '\r' <script_test.sh >script_test-converted.sh. Xem các lựa chọn thay thế cho chuyển đổi unix2dos .
pabouk

@ ngủyron tiếp tục: Theo "hash-tag", bạn có nghĩa là chuỗi shebang#!/bin/bash ? Đó là đường dẫn đến trình thông dịch tập lệnh sẽ đọc và giải thích tệp tập lệnh của bạn khi bạn thực thi nó. Ví dụ kịch bản Korn Shell sẽ bắt đầu bằng #!/bin/ksh.
pabouk

@ ngủyron Như tôi và Glenn đã viết trước đó: Trong trường hợp của bạn, hãy thay đổi #!/bin/shtập tin bắt đầu #!/bin/bashvì tập lệnh của bạn là tập lệnh Bash.
pabouk

Xin chào @pabouk, tôi không chắc bạn đang nói về cái gì. Tôi vẫn còn mới với tất cả những điều này. Mục đích của tôi chỉ là tạo một tập lệnh để tự động mô phỏng cho một danh sách các giá trị của một tham số và lặp lại mỗi lần mô phỏng N lần. Tôi đang sử dụng một phần mềm nguồn mở với tệp .cfg. Ngay bây giờ, tập lệnh đang hoạt động hoàn hảo sau khi tôi chuyển đổi nó bằng lệnh dos2unix trong cygwin. Cảm ơn đã quan tâm. Đây là hướng dẫn mà tôi làm theo: n3cat.upc.edu/tools/UserGuide/UserGuide.html
leepyron

0

Bạn đang sử dụng các tính năng bash nhưng sử dụng trình thông dịch sh. Thay đổi dòng shebang thành#!/bin/bash

Để giải mã:

$ /bin/sh
$ i=1
$ ((i++))
/bin/sh: i++: not found

0

Một giải pháp khả thi khác bằng cách sử dụng trình soạn thảo văn bản unix vi:

mở file trong vi chỉnh sửa bằng vi filename.shlệnh;

:set ff=unixlệnh vi ;

lưu tập tin với :wq

Nó sẽ lưu các tập tin với kết thúc dòng unix.

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.