2012-11-06 33 views
11

Rất giống to this question.echo "-n" sẽ không in -n?

Tôi đang lặp lại thông qua một vài điều với tập lệnh tự động bằng BASH. Thỉnh thoảng, tập lệnh sẽ xuất hiện "-n" và echo sẽ cố gắng diễn giải điều này.

Đã cố gắng này:

$ POSIXLY_CORRECT=1 /bin/echo -n 

$ POSIXLY_CORRECT=1 /bin/echo "-n" 

Nhưng nó giải thích lập luận mỗi lần.

Sau đó, điều này hoạt động nhưng có thể nhấn ký tự thoát trong chuỗi, đó là lý do tại sao tôi không muốn áp dụng ký tự rỗng cho tất cả đầu vào và sử dụng -e.

$ echo -e "\x00-n" 
-n 

printf là có thể, nhưng phải tránh trừ khi không có tùy chọn nào khác (Không phải tất cả các máy đều có printf làm tiện ích).

$printf "%s" "-n" 
-n 

Vì vậy, có cách nào để lấy tiếng vọng để in "-n"?

+1

Và câu hỏi là gì? – choroba

+0

Cái xấu của tôi, để lại nó trong tiêu đề. Đã thêm vào dòng cuối cùng. – MrDoom

+0

Đường liên quan, http://everything2.com/title/The+UNIX+and+the+Echo – tripleee

Trả lời

8

printf phải được tích hợp sẵn trong tất cả các trình bao của bạn, trừ khi một số máy của bạn có phiên bản shell cũ. Nó được tích hợp sẵn trong bash trong một thời gian dài. Nó có thể di động hơn echo -e.

Nếu không, thực sự không có cách nào để có được các tùy chọn echo mà bạn quan tâm.

Chỉnh sửa: từ an answer đến một câu hỏi tương tự khác; tránh trích dẫn vấn đề với printf bằng cách sử dụng tiện dụng không-quyền-giữ lại số wrapper này:

ech-o() { printf "%s\n" "$*"; } 

(Đó là ech-o, như trong "không có tùy chọn")

+1

printf là cách di động nhiều hơn so với tiếng vọng, nhưng hãy đảm bảo truyền chuỗi bạn muốn in làm đối số, * không * dưới dạng chuỗi định dạng (ví dụ: 'printf"% s \ n "" $ stringtoprint "' thay vì 'printf" $ stringtoprint \ n "') - xem câu trả lời của @ djhaskin987. –

+0

@GordonDavisson: Tôi đã thêm một ghi chú từ một câu trả lời khác của tôi, mà tôi nghĩ là một giải pháp tốt đẹp. – rici

+3

Hah! 1 cho một sử dụng thích hợp thực tế của '" $ * "' –

2

Nếu bạn gọi Bash với tên sh , nó sẽ bắt chước sh, trong đó tùy chọn -n không khả dụng cho echo. Tôi không chắc chắn nếu đó là phù hợp với nhu cầu của bạn mặc dù.

$ /bin/sh -c 'echo -n' 
+0

Điều đó '-n' không được chỉ rõ trong đặc tả lệnh shell POSIX.2 là không đúng sự thật. Hành vi tùy chọn (không phải chuỗi) cho '-n' được xác định như là một phần của hành vi chuẩn cơ bản (non-XSI) cho' echo'; nó chỉ là hệ vỏ thực hiện các phần mở rộng XSI tùy chọn mà nó không có mặt. Xem http://pubs.opengroup.org/onlinepubs/009604599/utilities/echo.html - bây giờ, được cấp, _your_ '/ bin/sh' có thể theo XSI, nhưng điều đó không được đảm bảo phổ biến. –

4

gì về tiền tố chuỗi với một nhân vật ("x" chẳng hạn) mà được lấy ra on-the-fly với một vết cắt:

echo "x-n" | cut -c 2- 
3

echo "-n" kể vỏ để đặt '-n' làm đối số đầu tiên của echo, ký tự cho ký tự. Về mặt ngữ nghĩa, echo "-n" giống với echo -n. Hãy thử điều này thay vì (đó là một tiêu chuẩn POSIX và nên làm việc trên bất kỳ vỏ):

printf '%s\n' "-n" 
1

echo "-n" sẽ không in -n-n được hiểu như là một lựa chọn cho echo (xem help echo).Nhưng bạn có thể sử dụng: Phương pháp

echo -e "\055n" 
+0

Điều này được hỗ trợ với việc thực thi GNU 'echo', nhưng không phải với bất kỳ phiên bản tuân thủ POSIX nào - việc triển khai POSIX tuân thủ XSI của' echo' sẽ in chữ '-e', và không phải là XSI giải thích '\ 055'. Thật vậy, nếu bạn 'xuất POSIXLY_CORRECT = 1' trên hệ thống GNU, bạn sẽ thấy hành vi cũ. –

0

gian lận:

echo -e "\r-n" 
+0

... hoạt động nếu đầu ra của bạn là dành cho tiêu thụ của con người, nhưng không phải nếu nó được đọc bởi một chương trình hoặc người tiêu dùng không phải là thiết bị đầu cuối khác. –

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