2015-10-27 14 views
5

Tôi đang cố gắng để chạy này:python lệnh multiline chạy từ bash

python -c "for i in range(10):\n print i" 

nhưng tôi nhận được một lỗi:

File "<string>", line 1 
for i in range(10):\n print i 
          ^
SyntaxError: unexpected character after line continuation character 

Theo this tôi cho rằng bash nên đã xử lý (cụ thể là, biểu thức dòng lệnh) đối số dòng lệnh nhưng lỗi được trả về cho biết trường hợp ngược lại. Tôi đang ở đâu sai, và tại sao điều này lại xảy ra?

P.S. python-2,7

EDIT

Hãy để tôi giải thích động lực của tôi một chút. Ví dụ mã này chắc chắn là khá ngớ ngẩn. Kể từ the doc nói rằng "command có thể là một hoặc nhiều câu lệnh được phân tách bằng dòng mới, với khoảng trắng phía trước quan trọng như trong mã mô-đun bình thường", tôi quan tâm đến cách tôi nên mang những dòng mới được đề cập đến command đúng cách. Các giải pháp đề xuất ở đây là:

  1. Sử dụng ; để phân biệt một số lệnh bên trong vòng lặp. Có, nhưng nó vẫn là một lớp lót, tôi không thể sử dụng nó nếu tôi muốn chạy một số lệnh sau vòng lặp. ; không thay thế cho dòng mới.

  2. Nhập ^M nơi cần dòng mới. Điều này đạt mục tiêu chính xác hơn nhưng không may, theo quan điểm của tôi, điều này về cơ bản hủy hoại toàn bộ ý tưởng chạy mã python từ dòng lệnh vì nó đòi hỏi chế độ tương tác. Theo tôi hiểu nó giống như nhập một lệnh kiến ​​đánh Enter phím. Vì vậy, không có sự khác biệt để gõ python và làm việc trong vỏ của nó. Điều đó nói rằng, tôi không thể viết điều này trong một kịch bản bash. Hoặc tôi có thể?

Có lẽ câu hỏi thực sự nên đã được tách ra thành hai cái:

  1. Bash thoát:

    Enclosing characters in double quotes (‘"’) preserves the literal value of all characters within the quotes, with the exception of ‘$’, ‘ ’, ‘\’, and, when history expansion is enabled, ‘!’. The characters ‘$’ and ‘ ’ retain their special meaning within double quotes (see Shell Expansions). The backslash retains its special meaning only when followed by one of the following characters: ‘$’, ‘`’, ‘"’, ‘\’, or newline.

Làm thế nào để tương ứng này đối với trường hợp được mô tả? Bash xử lý các dòng mới như thế nào? Tôi thấy rằng việc đưa lệnh vào dấu ngoặc đơn không làm thay đổi.

  1. Làm thế nào để chuyển một dòng mới đến python theo cách không tương tác.(Bạn có thể nói - tại sao bạn không viết một tệp trăn thông thường với tất cả các dòng mới bạn muốn - bạn đúng nhưng tôi quan tâm đến những gì chính xác có nghĩa là trong tài liệu kể từ khi nó báo giá dòng mới)
+0

Phiên bản python nào bạn đang chạy? – DanHabib

Trả lời

2

Bạn thực sự sẽ cần phải chuyển đổi phần \n thành một dòng mới thực tế. Điều đó có thể được thực hiện với sự $'' cú pháp:

python -c $'for i in range(10):\n print i' 
0 
1 
2 
3 
4 
5 
6 
7 
8 
9 

Bạn cũng có thể đạt được kết quả đó với echo -e hoặc printf

$ python -c "$(echo -e "for i in range(10):\n print i")" 

Bạn cũng có thể sử dụng một đây chuỗi:

$ python <<< $(echo -e "for i in range(10):\n print i") 

Xem phần 3.1.2.4 ANSI-C Quoting của Bash Manpage để biết thêm thông tin.

3

Di \n

python -c "for i in range(10): print i" 

Hoặc

Bạn có thể sử dụng ; để sử dụng nhiều dòng trong vòng lặp for

python -c "for i in range(10): print '1st newline';print '2nd newline';print i" 
+1

Điều này chắc chắn không trả lời được câu hỏi. Đề xuất của bạn làm cho lệnh một lót – DimG

+0

Tại sao bạn đang sử dụng dòng mới? – Kalanidhi

+0

Đây chỉ là ví dụ làm việc nhẹ mô phỏng vấn đề, mã thực tế phức tạp hơn một chút và nó cần và nó cần phải có nhiều dòng. – DimG

1

Bạn có thể chạy nhiều dòng python tuyên bố -c bằng cách thêm ký tự CR phù hợp của bạn:

python -c "for i in range(10):^M print (i)^M print ('Hello:' + str(i*i))" 

nơi^M không thực sự^tiếp theo M, nó thực sự là nhân vật bạn nhận được khi bạn gõ [ CTRL-v] [CTRL-m]. Chú ý không gian sau khi nhân vật này, có nghĩa là có hai báo cáo in trong vòng lặp for, và nó nên in:

0 
Hello:0 
1 
Hello:1 
.... 
9 
Hello:81 

Bạn có thể làm điều này trong một kịch bản bash quá:

#!/bin/bash 
A="python -c \"for i in range(10):^M print (i)^M print ('Hello:' + str(i*i))\"" 
eval $A 
+0

Vui lòng xem câu hỏi đã chỉnh sửa – DimG