'echo' tanpa baris baru dalam skrip shell

541

Saya memiliki masalah dengan echoskrip saya:

echo -n "Some string..."

cetakan

-n Some string...

dan pindah ke baris berikutnya. Di konsol itu berfungsi dengan baik tanpa baris baru:

Some string...
qwertz
sumber
2
Implementasi bourne shell mana yang Anda gunakan? Jika saya menjalankan bashdalam mode bourne shell, itu berfungsi dengan baik di sini. Juga, agak tidak mungkin Anda benar-benar menggunakan shell bourne sebagai shell interaktif Anda, bukan?
FatalError
4
di Ubuntu:echo -ne "text without new line: "; echo "some text";
zsoltii
Saya tahu ini sangat lama, tetapi ini berfungsi untuk saya di Windows 10, untuk menambahkan periode tanpa baris baru: echo | set / p = "."
SPlatten

Jawaban:

574

Ada beberapa versi echoperintah, dengan perilaku berbeda. Rupanya shell yang digunakan untuk skrip Anda menggunakan versi yang tidak dikenali -n.

The printfperintah memiliki perilaku yang jauh lebih konsisten. echobaik untuk hal-hal sederhana seperti echo hello, tetapi saya sarankan menggunakan printfuntuk hal yang lebih rumit.

Sistem apa yang Anda gunakan, dan shell apa yang digunakan skrip Anda?

Keith Thompson
sumber
46
Dengan memulai dengan garis #!/bin/bashitu berhasil. Biasanya saya bekerja dengan bash.
qwertz
Saya berharap ada Windows yang setara di CMD :( Sejauh yang saya bisa lihat, tidak ada, hanya workarounds untuk mencapai perilaku yang sama.
kayleeFrye_onDeck
2
@ KayleeFrye_onDeck: Mungkin ada versi Windows dari printfperintah.
Keith Thompson
Saya harap. echoselalu menambahkan baris baru ... Penanganannya jenky di terbaik.
kayleeFrye_onDeck
2
@alper %Adalah prompt shell Anda. Coba ini, dan perhatikan dengan cermat:printf hello; sleep 5
Keith Thompson
150

bash memiliki perintah "built-in" yang disebut "echo":

$ type echo
echo is a shell builtin

Selain itu, ada perintah "echo" yang dapat dieksekusi (yaitu, shell fork dan eksekutif /bin/echo, yang bertentangan dengan menafsirkan echodan mengeksekusi itu):

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

Perilaku echoWRT baik \cdan -nbervariasi. Taruhan terbaik Anda adalah menggunakan printf, yang tersedia pada empat rasa * NIX berbeda yang saya lihat:

$ printf "a line without trailing linefeed"
$ printf "a line with trailing linefeed\n"
aqn
sumber
3
Terima kasih atas jawaban mendalam yang mendalam!
Darth Egregious
91

Coba dengan

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

Ini bekerja untuk saya seperti yang diharapkan (seperti yang saya mengerti dari pertanyaan Anda).

Perhatikan bahwa saya mendapat informasi ini dari manhalaman. The manhalaman juga mencatat shell mungkin memiliki versi sendiri echo, dan saya tidak yakin apakah bashmemiliki versi sendiri.

Nak
sumber
Memberi +1 kepada saya untuk mengarahkan saya ke arah yang benar, meskipun gema yang tidak mengenali opsi -ne mungkin tidak mengenali opsi -e (juga tidak perlu) sehingga Anda mungkin hanya ingin mengatakannya echo "some string...\c"saja. Namun jika Anda perlu mendukung beberapa varian bash dengan perintah gema yang sangat berbeda, Anda mungkin lebih baik menggunakan printf atau Anda perlu memeriksa kemampuan perintah gema dengan sesuatu seperti [ -n "$( echo -e )" ] && echo "sh stuff\c" || echo -e "bash stuff\c"(setidaknya bash mendukung \ c juga, jadi tidak perlu menggunakan -n opsi, tetapi Anda membutuhkan -e untuk bash)
Timo
Bagi saya, ini tidak persis apa-n dalam kasus OP: output literal -e. Saya kira printf memang lebih konsisten
aexl
-e tidak akan bekerja dalam skrip posix shell, itu akan ditampilkan ke layar sebagai gantinya.
Thomas Dignan
7

Untuk mencapai ini pada dasarnya ada dua metode yang sering saya gunakan:

1. Menggunakan karakter pelarian kursor ( \c) denganecho -e

Contoh :

for i in {0..10..2}; do
  echo -e "$i \c"              
done
# 0 2 4 6 8 10
  • -eflag memungkinkan karakter E scape dalam string.
  • \cmengembalikan kursor C ke garis saat ini.

ATAU

2. Menggunakan printfperintah

Contoh :

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

Jika Anda menggunakan gema di dalam sebuah if dengan perintah lain, seperti "baca", mungkin mengabaikan pengaturan dan toh akan melompat ke baris baru.

Alexandre Strube
sumber
2

Hanya untuk linux yang paling populer Ubuntu & itu bash:

  1. Periksa cangkang mana yang Anda gunakan? Sebagian besar di bawah ini berfungsi, kalau tidak lihat ini :

    echo $0

  2. Jika cetakan di atas bash, maka di bawah ini akan berfungsi:

    printf "hello with no new line printed at end"
    ATAU
    echo -n "hello with no new line printed at end"

Manohar Reddy Poreddy
sumber
1

Saya yakin saat ini hasil cetak Anda seperti di bawah ini

~ echo -e "String1\nString2"
String1
String2

Anda dapat menggunakan xargsuntuk mendapatkan stdout multiline ke baris yang sama.

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

 ~
rɑːdʒɑ
sumber
0

Ketika Anda pergi dan menulis skrip shell Anda selalu menempatkan baris pertama sebagai #! / Usr / bin / env bash. Shell ini tidak menghilangkan atau memanipulasi urutan escape. ex echo "Ini pertama \ n baris" mencetak Ini adalah pertama \ n baris.

Amit Singh
sumber
0
enable -n echo
echo -n "Some string..."
Riccardo La Marca
sumber