Làm cách nào tôi có thể in ấn -nv với `echo`?


7

Tôi không thể tìm ra cách in chuỗi "-n" bằng lệnh trên 30 năm tuổi echo.

Tôi đã thử những điều này:

Michaels:Scripts$ echo -n
Michaels:Scripts$ echo "-n"
Michaels:Scripts$ echo -e "-n"
Michaels:Scripts$ echo -- -n
-- -n
Michaels:Script$ echo -- "-n"
-- -n
Michaels:Script$ echo "\-n"
\-n

Tôi sử dụng Mac OS X ML. Tôi coi hành vi này rất kỳ lạ và bất ngờ.



Có khả năng bạn có thể sử dụng một khoảng echo " -n"
trắng,

Câu trả lời:


7

Nếu bạn không muốn sử dụng, prinfbạn có một vài lựa chọn, ít nhất là theo Câu hỏi và trả lời SO này, có tiêu đề: echo Hồi -n xuất sẽ không in -n? .

Đây dường như là lựa chọn tốt nhất của bạn:

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

Hoặc một số biến thể:

$ echo -- '-n'|cut -d" " -f2
-n

in

printf không có vấn đề này:

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

Bạn có thể vui lòng giải thích lệnh thứ hai, đặc biệt. phần cắt của nó :)
Michael

1
@Michael - chắc chắn, nó lấy đầu ra từ echo -- '-n', đó là -- -n. cutsau đó phân tách đầu ra trên các khoảng trắng và lấy trường thứ 2, do đó -n.
slm

7

Tại sao bạn muốn sử dụng echo? Sử dụngprintf :

printf -- '-n\n'

Hoặc là:

printf '%s\n' -n

Với echo:

echo -n

Sẽ xuất ra -n<LF>trong một tuân thủ UNIX echo.

bash,, dashGNU hoặc zshecho (trong cấu hình mặc định của chúng) có thể làm điều đó với:

echo -en '-n\n'

Hoặc (trên các hệ thống dựa trên ASCII):

echo -e '\055n'

Zsh echocó thể làm điều đó với:

echo - -n

bash(nhưng không zsh):

echo -n -; echo n

Điều thú vị là, nó là không thể để đầu ra -nvới echomình trong một cách POSIX (có nghĩa là, nhiều hơn hoặc ít hơn, portably trên unices và Unix-thích), kể từ khi hành vi đó nếu đối số đầu tiên là -nhay nếu có tranh cãi chứa các ký tự dấu chéo ngược là không xác định.


Nếu bạn có một thiết bị đầu cuối unicode, bạn có thể xuất \ u2011 (hoặc \ u2010) trông giống hệt một -. Nhưng đó không phải là một giải pháp (và không có cách di động nào để giới thiệu các ký tự unicode mà không biết mã hóa của trình giả lập thiết bị đầu cuối).
ngày

Tôi đang sử dụng ksh, echo -e "\ x2d" đang in "\ x2d" nhưng biểu thức bát phân echo -e "\ 055" đang in đúng "-". Bạn có suy nghĩ gì không? Cảm ơn
Người học mãi mãi

1
@CppLearner, có echokhông phải là di động. Đừng sử dụng echo. Đối với Unix compliant echo's echo '\055'sẽ ra byte 0x2d ( -trong ASCII, nhưng hệ thống Unix không cần phải sử dụng ASCII như bảng mã cơ sở của họ, một số vẫn sử dụng EBCDIC). Nhưng hành vi cho echo '\x2d'là không xác định. Tương tự printf '\055'là POSIX và di động, printf '\x2d'là không.
Stéphane Chazelas

Cảm ơn bạn rất nhiều Stéphane Chazelas đã làm rõ và quay vòng nhanh chóng.
Người học mãi mãi

2

Vì các lý do lịch sử, echokhông thực hiện phân tích cú pháp đối số thông thường trong đó bất kỳ đối số nào bắt đầu bằng -là một tùy chọn ngoại trừ --báo hiệu kết thúc tùy chọn. Các echolệnh chủ yếu in đối số của nó không thay đổi, nhưng tùy thuộc vào biến thể unix, trên vỏ và về cách vỏ được cấu hình, nó có thể giải thích một số tùy chọn ( -e, -E, -n, -) và có thể đối xử với dấu chéo ngược + nhân vật đặc biệt.

Không có cách nào di động để in -nvới echomột mình. Cách di động để in một chuỗi mà không phải lo lắng về các ký tự đặc biệt là

printf %s -n

hoặc nói chung hơn print %s "$somestring". Nếu bạn muốn in một dòng mới cuối cùng sau chuỗi, hãy thực hiện điều đó printf '%s\n' -n.


0

Hãy thử điều này, nếu bạn cần "-n" làm hai biểu tượng đầu tiên:

echo -e '\r-n'

Một cách khác:

echo -n '-'; echo 'n'

Điều này in thêm một CR ở đầu.
Gilles 'SO- ngừng trở nên xấu xa'

Bạn sử dụng loại thuật ngữ nào?
stackexchanger

Những loại của những gì? Vỏ? Bất kỳ shell nào thực hiện -esẽ in 4 byte: 0d 2d 6e 0a(được viết bằng hex). Bất kỳ shell nào không thực hiện -esẽ in 2d 65 20 5c 72 2d 6e 0ahoặc 2d 65 20 0d 2d 6e 0a.
Gilles 'SO- ngừng trở nên xấu xa'

Hay bạn có nghĩa là loại thiết bị đầu cuối? Điều đó không liên quan. CR có thể không rõ ràng nếu echođang ghi vào thiết bị đầu cuối, nhưng nó có ở đầu ra của echo.
Gilles 'SO- ngừng trở nên xấu xa'

Có, hạn, có nghĩa là thiết bị đầu cuối. Người hỏi chỉ muốn in, hãy thử biến thể của tôi với bash + Linux. Có thể MacO làm sai.
stackexchanger
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.