'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...

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?


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"

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.


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

3

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


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"


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

 ~

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.


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.