'echo' không có dòng mới trong tập lệnh shell


541

Tôi có một vấn đề với echokịch bản của mình:

echo -n "Some string..."

in

-n Some string...

và di chuyển đến dòng kế tiếp. Trong bảng điều khiển, nó hoạt động chính xác mà không cần dòng mới:

Some string...

2
Mà bourne shell thực hiện bạn đang sử dụng? Nếu tôi chạy bashtrong chế độ vỏ bourne, nó hoạt động tốt ở đây. Ngoài ra, có vẻ như bạn không thực sự sử dụng vỏ bourne làm vỏ tương tác của mình, phải không?
FatalError

4
trên Ubuntu:echo -ne "text without new line: "; echo "some text";
zsoltii

Tôi biết điều này rất cũ, nhưng điều này hoạt động với tôi trong Windows 10, để thêm một khoảng thời gian không có dòng mới: echo | đặt / p = "."
SPlatten

Câu trả lời:


574

Có nhiều phiên bản của echolệnh, với các hành vi khác nhau. Rõ ràng shell được sử dụng cho tập lệnh của bạn sử dụng phiên bản không nhận ra -n.

Các printflệnh có hành vi nhiều nhất quán hơn. echotốt cho những điều đơn giản như echo hello, nhưng tôi khuyên bạn nên sử dụng printfcho bất cứ điều gì phức tạp hơn.

Bạn đang sử dụng hệ thống nào và kịch bản của bạn sử dụng trình bao nào?


46
Bằng cách bắt đầu với dòng #!/bin/bashnó hoạt động. Thông thường tôi đang làm việc với bash.
QWERTZ

Tôi ước có một Windows tương đương trong CMD :( Theo như tôi thấy, không có, chỉ có cách giải quyết để đạt được hành vi tương tự.
kayleeFrye_onDeck

2
@kayleeFrye_onDeck: Có lẽ có phiên bản Windows của printflệnh.
Keith Thompson

Tôi ước. echoluôn luôn thêm các dòng mới ... Cách giải quyết tốt nhất là vui nhộn.
kayleeFrye_onDeck

2
@alper Đây %là dấu nhắc của bạn. Hãy thử điều này và xem một cách cẩn thận:printf hello; sleep 5
Keith Thompson

150

bash có một "built-in" lệnh gọi "echo":

$ type echo
echo is a shell builtin

Ngoài ra, có một lệnh "echo" là một lệnh thực thi thích hợp (nghĩa là shell forks và execs /bin/echo, trái ngược với việc diễn giải echovà thực thi nó):

$ ls -l /bin/echo
-rwxr-xr-x 1 root root 22856 Jul 21  2011 /bin/echo

Hành vi của echoWRT của một trong hai \c-nkhác nhau. Đặt cược tốt nhất của bạn là sử dụng printf, có sẵn trên bốn hương vị * NIX khác nhau mà tôi đã xem:

$ printf "a line without trailing linefeed"
$ printf "a line with trailing linefeed\n"

3
Cảm ơn câu trả lời ồ ạt!
Darth Egregious

91

Thử với

echo -e "Some string...\c"

Nó hoạt động với tôi như mong đợi (như tôi đã hiểu từ câu hỏi của bạn).

Lưu ý rằng tôi đã nhận được thông tin này từ mantrang. Các mantrang cũng lưu ý vỏ có thể có phiên bản riêng của mình echo, và tôi không chắc chắn nếu bashcó phiên bản riêng của mình.


+1 để gợi ý cho tôi đi đúng hướng, mặc dù tiếng vang không nhận ra tùy chọn -ne có thể không nhận ra tùy chọn -e (cũng không cần) nên bạn có thể chỉ muốn nói echo "some string...\c"thay thế. Tuy nhiên, nếu bạn cần hỗ trợ nhiều biến thể bash với các lệnh echo khác nhau, bạn có thể sử dụng printf tốt hơn hoặc bạn cần kiểm tra các khả năng của lệnh echo với một cái gì đó như [ -n "$( echo -e )" ] && echo "sh stuff\c" || echo -e "bash stuff\c"(ít nhất là bash cũng hỗ trợ \ c, vì vậy không cần sử dụng -n tùy chọn, nhưng bạn cần -e cho bash)
Timo

Đối với tôi, điều này thực hiện chính xác những gì -n làm trong trường hợp của OP: xuất ra chữ -e. Tôi đoán printf thực sự phù hợp hơn
aexl

-e sẽ không hoạt động trong tập lệnh shell posix, thay vào đó nó sẽ được xuất ra màn hình.
Thomas Dignan

7

Để đạt được điều này về cơ bản có hai phương pháp mà tôi thường xuyên sử dụng:

1. Sử dụng ký tự thoát con trỏ ( \c) vớiecho -e

Ví dụ :

for i in {0..10..2}; do
  echo -e "$i \c"              
done
# 0 2 4 6 8 10
  • -ecờ cho phép các ký tự E scape trong chuỗi.
  • \cđưa con trỏ C trở lại dòng hiện tại.

HOẶC LÀ

2. Sử dụng printflệnh

Ví dụ :

for ((i = 0; i < 5; ++i)); do
  printf "$i "
done
# 0 1 2 3 4

3

Nếu bạn sử dụng echo bên trong if với các lệnh khác, như "đọc", nó có thể bỏ qua cài đặt và dù sao nó cũng sẽ chuyển sang một dòng mới.


2

Chỉ dành cho linux phổ biến nhất Ubuntu & đó là bash:

  1. Kiểm tra vỏ nào bạn đang sử dụng? Hầu hết các công trình dưới đây, khác thấy điều này :

    echo $0

  2. Nếu ở trên bản in bash, thì bên dưới sẽ hoạt động:

    printf "hello with no new line printed at end"
    HOẶC LÀ
    echo -n "hello with no new line printed at end"


1

Tôi tin ngay bây giờ đầu ra của bạn in như dưới đây

~ echo -e "String1\nString2"
String1
String2

Bạn có thể sử dụng xargsđể có được thiết bị xuất chuẩn đa dòng vào cùng một dòng.

 ~ echo -e "String1\nString2" | xargs
String1 String2

 ~

0

Khi bạn đi và viết kịch bản shell của bạn luôn đặt dòng đầu tiên là #! / Usr / bin / env bash. Shell này không bỏ sót hoặc thao tác các chuỗi thoát. ex echo "Đây là dòng \ n đầu tiên" Đây là dòng \ n đầu tiên.


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.