2011-03-08 43 views
9

tôi nhận được báo lỗi dưới đây khi cố gắng thực hiện một kịch bản shell, r nhân vật trong kịch bản shell

$'\r': command not found: line 2: 

Xin đề nghị một giải pháp cho cùng.

Dưới đây là những dòng ban đầu được sử dụng trong kịch bản,

#!/bin/sh 

if [[ $# -lt 1 ]]; then 
    echo "ERROR Environment argument missing <dev,test,qa,prod>" 
    export RC=50 
    exit $RC 
fi 
+1

Hai hoặc ba dòng đầu tiên trong kịch bản lệnh shell của bạn là gì?:) – sarnold

+0

Vui lòng đăng toàn bộ tập lệnh hoặc đủ để cho phép mọi người tạo lại sự cố – Tony

+0

\ r \ n là cửa sổ cuối dòng .. u có viết nó trong cửa sổ không? nếu có, chỉ cần nhập lại: P – Sigtran

Trả lời

1

tôi nhận được một thông báo lỗi khác nhau khi chạy kịch bản của bạn dưới /bin/sh, nhưng khi tôi chuyển sang /bin/bash, nó làm việc tốt:

$ cat foo.sh 
#!/bin/sh 
if [[ $# -lt 1 ]]; 
    then echo "ERROR Environment argument missing" 
    RC=50 
    exit $RC 
fi 
$ sh foo.sh 
foo.sh: 6: [[: not found 
$ bash foo.sh 
ERROR Environment argument missing 

Bạn đã xây dựng trong một bashism. Điều này có thể hoặc có thể không phải là một việc lớn đối với tổ chức của bạn. Nếu bạn muốn tiếp tục sử dụng bash các tính năng cụ thể, hãy thay đổi dòng shebang thành #!/bin/bash và xem điều đó có hữu ích hay không.

+0

Cảm ơn sarnold cho phản ứng. Tôi đã thử cùng một kịch bản sau khi thay đổi để bash và với debug bật ON. Tôi vẫn nhận được lỗi, Bên dưới là đầu ra, $ bash -xv foo.sh #!/Bin/bash + $ '\ r' : lệnh không tìm thấy người phát hiện.sh: dòng 2: nếu [[$ # -lt 1]]; sau đó echo "ERROR luận Môi trường thiếu " xuất khẩu RC = 50 exit $ RC fi ConstruedTermsXMLGenerator.sh: dòng 7: lỗi cú pháp gần bất ngờ thẻ 'fi' ConstruedTermsXMLGenerator.sh: dòng 7: 'fi ' – Mohan

+0

@Mohan, thì có lẽ @Sigtran là chính xác; tệp này có bắt nguồn từ Windows không? Nếu vậy, hãy chạy 'dos2unix' hoặc' dtox' hoặc một trong những loại công cụ tương tự đó để xóa tất cả các ký tự '\ r' thừa khỏi tệp. – sarnold

+0

Nhưng, cùng một tập lệnh hoạt động tốt khi nó được đặt trong thư mục/tmp và được thực thi. Sao có thể như thế được? – Mohan

13

Vấn đề của bạn là tệp có đuôi dòng Windows. Điều này có thể được gây ra bằng cách chỉnh sửa một tập tin trong Windows và cố gắng chạy nó trên một hệ thống không phải Windows.

Bạn có thể khắc phục vấn đề này bằng dos2unix để chuyển đổi kết thúc dòng:

dos2unix ConstruedTermsXMLGenerator.sh 

Tiện ích tương ứng để chuyển đổi theo một hướng khác là unix2dos.

Một số hệ thống có fromdostodos.

+0

@Mohan, nếu bạn ftp tập lệnh của mình từ cửa sổ sang * nix, hãy đảm bảo bạn chuyển nó thành ascii. Nếu bạn scp nó, bạn phải sử dụng 'dos2unix' ở phía xa. Hoặc sử dụng một trình soạn thảo văn bản có thể lưu ở định dạng "unix". –

+0

Notepad ++ trên Windows bằng cách sử dụng tính năng mã hóa Ansi để thực hiện việc này. Sử dụng "Lưu dưới dạng tệp bash unix" thay vì "Lưu". –

0

Tôi gặp vấn đề chính xác khi tạo tệp .sh trên máy Mac (unix) và thực thi nó trong Linux. Hóa ra rằng tôi đã để đặt thiết lập FileZilla FTP để 'Binary' loại chuyển:

  • "Cài đặt> Chuyển> File Types> Mặc định chuyển loại" thành "Binary" (thay vì " Auto ")
0

tôi đã có lỗi tương tự và những gì tôi đã làm là để chuyển đổi ký tự '\r'-'\n'. sử dụng dòng này:

tr '\r' '\n' <oldfile.sh> newfile.sh 
mv newfile.sh oldfile.sh 
chmod +x oldfile.sh 
./oldfile.sh 

Tôi nghĩ bạn cũng có thể xóa các '\ r' nhân vật bằng cách sử dụng:

tr -d '\r' <oldfile.sh> newfile.sh 

tr là trasnform lệnh, và -d là xóa các ký tự sau.

Tôi nghĩ rằng vỏ thực sự không giống như ký tự '\r'.

0

Bạn có thể sử dụng sed -i 's/\r$//' scriptname.sh

Thay Tập lệnh với tên kịch bản thực tế.

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