Bagi mereka yang mengatakan "itu bekerja untuk saya", perilaku gema sedikit berbeda antara versi. Beberapa bahkan akan mencetak "-e" sebagai bagian dari output mereka. Jika Anda ingin perilaku yang dapat diprediksi untuk hal-hal nontrivial, gunakan printf sebagai gantinya (seperti dalam jawaban @ sth).
Gordon Davisson
6
Aku tidak bisa mendapatkan salah satu saran dalam jawaban kerja ini, karena, ternyata, saya mencoba untuk menggunakannya dalam fungsi yang kembali nilai , dan semua echo (dan printf) pesan dalam fungsi sedang ditambahkan ke nilai kembali setelah secara terpisah dilepas dari baris baru . Berikut adalah pertanyaan mengenai hal ini, dengan jawaban yang sangat teliti: stackoverflow.com/questions/27872069/… Ini seperti tur misteri tiga jam.
aliteralmind
8
Juga penting: di Unix & Linux Stack Exchange, jawaban yang diterima untuk Bagaimana menambahkan baris baru saat menggunakan gema
Graham Perrin
@ GrahamPerrin, terima kasih atas tautannya ke jawaban yang sangat bagus dan terperinci! Saya pikir ini lebih baik daripada jawaban di bawah ini.
Konstantin
2
echo -ne "hello \ nworld" (Anda membutuhkan n flag untuk menafsirkan lolos) - tetapi seperti yang orang lain katakan, perintah gema yang berbeda mungkin memiliki hasil yang berbeda!
Konchog
Jawaban:
2879
Anda bisa menggunakan printf:
printf "hello\nworld\n"
printfmemiliki perilaku yang lebih konsisten daripada echo. Perilaku echosangat bervariasi antara versi yang berbeda.
atau bahkan printf %"s\n" hello world- printf akan menggunakan kembali format jika terlalu banyak argumen diberikan
glenn jackman
28
OP bertanya tentang gema, bukan printf; dan jawaban @ choroba di bawah ini, yang menggunakan opsi -e, mengisi tagihan dengan sempurna.
YESUS
57
@ YESUS: Cocok jika Anda echokebetulan mendukung -eopsi.
sth
11
Dengan beberapa versi echo, -ebaru saja dicetak dalam output itu sendiri jadi saya pikir jawaban ini sangat valid karena echotidak konsisten di sini (kecuali kita berbicara tentang versi tertentu).
Tejas Manohar
14
Ini bagus dan bagus jika printf tersedia, tetapi tidak seperti echo, terkadang printf tidak ada di distro.
bigtunacan
1713
Apakah Anda yakin berada dalam bash? Bekerja untuk saya, keempat cara:
-E bendera melakukannya untuk saya, yang "memungkinkan interpretasi lolos backslash"
tandy
21
Saya pikir -eparam tidak ada di semua * nix OS
kenorb
12
@kenorb: Ada di bash. Itu adalah builtin.
choroba
Mengapa yang ketiga berfungsi? Tanpa $ itu mengembalikan "Hello n world"
Evan Donovan
21
Seperti disebutkan oleh berbagai lainnya -e TIDAK bekerja untuk semua distribusi dan versi. Dalam beberapa kasus itu diabaikan dan dalam kasus lain itu benar-benar akan dicetak. Saya tidak percaya ini memperbaikinya untuk OP jadi sebaiknya tidak diterima jawaban
Kata-kata dalam bentuk diperlakukan secara khusus. Kata diperluas ke string , dengan karakter backslash-escaped diganti sebagaimana ditentukan oleh standar ANSI C.$'string'
@ EvgeniSergeev Tidak yakin apa yang Anda maksud, tetapi tidak berhasil untuk saya dulu. Dan itu karena saya menggunakan tanda kutip ganda dan ternyata ini hanya berfungsi dengan tanda kutip tunggal! Mencoba di Terminal pada Mac.
trss
11
Masalah dengan variabel dalam string tidak diperluas.
willemdh
Anda masih dapat menggabungkan string kutipan ganda. `foo =" bar "; echo $ '' $ foo'efoot'`
echo ""bekerja untuk saya dan saya pikir itu adalah bentuk paling sederhana untuk mencetak baris baru, bahkan jika ini tidak langsung menjawab pertanyaan. Bersulang.
Mario Awad
2
Saya pikir itu kurang jelas (dan karenanya berpotensi lebih membingungkan) daripada echo -en "\n".
Jika ada seseorang yang membenturkan kepalanya ke dinding mencoba mencari tahu mengapa naskah rekan kerjanya tidak akan mencetak baris baru, perhatikan ini ->
#!/bin/bashfunction GET_RECORDS(){
echo -e "starting\n the process";}
echo $(GET_RECORDS);
Seperti pada contoh di atas, menjalankan aktual dari metode itu sendiri dapat dibungkus dalam gema yang menggantikan setiap gema yang mungkin ada dalam metode itu sendiri. Jelas saya mempermudah ini untuk singkatnya, tidak begitu mudah dikenali!
Anda kemudian dapat memberi tahu kawan-kawan Anda bahwa cara yang lebih baik untuk menjalankan fungsi adalah seperti ini:
#!/bin/bashfunction GET_RECORDS(){
echo -e "starting\n the process";}
GET_RECORDS;
Jawaban yang terlalu diremehkan, tidak percaya pertanyaan ini telah mengumpulkan 20+ jawaban sejak 2011 dan tidak ada satupun dari mereka yang berisi solusi sederhana ini.
Prometheus
alias c = 'echo; gema; gema; gema; gema; gema; gema; gema; gema; gema; gema; gema; gema; gema; gema; gema; gema; gema; gema; gema; gema; gema; gema; gema; gema; gema; gema; gema; gema; gema; gema; gema; gema; gema; gema; gema; ' Ini satu-satunya cara saya bisa menghapus layar saya, terima kasih!
Ahi Tuna
@Ahi Tuna: Silakan gunakan pintasan keyboard konsol Anda :)
R Sun
@Run dan bagaimana saya melakukannya pada jendela terminal Debian di Chromebook?
Ahi Tuna
1
@ AhiTuna jelas; atau ctrl + l;
Mike Seeds
16
str='hello\nworld'
$ echo | sed "i$str"
hello
world
Bagaimana Anda mengetikkan baris itu tanpa memiliki shell untuk menjalankan perintah ketika Anda menekan Ènter`?
Xenos
@Xenos Ini berfungsi dengan baik dalam sebuah skrip. Dan di konsol, cukup klik pada Shift + Enter untuk menambahkan baris baru untuk menghindari shell untuk menjalankan perintah yang belum selesai.
vinzee
5
Satu lagi entri di sini untuk mereka yang tidak membuatnya bekerja dengan salah satu solusi ini, dan perlu mendapatkan nilai balik dari fungsinya:
function foo(){local v="Dimi";local s="";.....
s+="Some message here $v $1\n".....
echo $s
}
r=$(foo "my message");
echo -e $r;
Hanya trik ini yang berhasil di linux yang saya kerjakan dengan bash ini:
GNU bash, version 2.2.25(1)-release (x86_64-redhat-linux-gnu)
Semoga ini membantu seseorang dengan masalah serupa.
Hanya sebuah catatan, Anda mungkin ingin menggunakan $ {} di sekitar nama variabel Anda karena tidak melakukannya dapat menyebabkan perilaku yang sangat aneh ketika shell menemukan variabel yang disebut $ warningsFound dan mencetaknya dan bukan dua output yang terpisah.
dragon788
@ dragon788 mungkin saya kehilangan sesuatu, tetapi variabel IS sebenarnya disebut $ warningsFound?
psynnott
2
Saya melewatkan satu kata tentang itu. Jika Anda memiliki variabel yang disebut $ peringatan, dalam beberapa kasus tanpa menggunakan $ {warningsFound}, Anda berpotensi berakhir dengan isi $ peringatan + "Ditemukan" alih-alih variabel yang Anda maksudkan.
dragon788
3
Anda juga bisa menggunakan gema dengan kawat gigi,
kesalahan sintaksis dekat token tak terduga `('saat dipanggil dalam file .sh
cosbor11
1
cobaecho hello; echo world
Avinash Raj
1
Atau "echo hello && echo world" atau hanya: "echo hello echo world
csga5000
3
Ini bisa dilakukan sebagai
x="\n"
echo -ne $x
Opsi -e akan menginterpretasikan backslahes untuk urutan escape
-n opsi akan menghapus baris baru yang tertinggal di output
PS: gema perintah memiliki efek selalu menyertakan baris baru yang tertinggal dalam output sehingga -n diperlukan untuk mematikan hal itu (dan membuatnya kurang membingungkan)
Jika Anda menulis skrip dan akan menggema baris baru sebagai bagian dari pesan lain beberapa kali, solusi lintas platform yang bagus adalah dengan meletakkan baris baru literal dalam variabel seperti:
newline='
'
echo "first line$newlinesecond line"
echo "Error: example error message n${newline}${usage}">&2#requires usage to be defined
Ini salah. Itu tidak pernah diartikan sebagai \n. Ini ditafsirkan sebagai argumen terpisah untuk program, dan program itu sendiri dapat menampilkan argumen itu pada baris baru, tetapi itu tidak berarti bahwa itu dikonversi ke \ntitik mana pun dan sepenuhnya tergantung pada program.
Score_Di Bawah
0
Saya harus mengelilingi teks dengan tanda kutip ganda saat menggunakan sebagai alias di profil bash (MacOx, iTerm).
Jawaban:
Anda bisa menggunakan
printf
:printf
memiliki perilaku yang lebih konsisten daripadaecho
. Perilakuecho
sangat bervariasi antara versi yang berbeda.sumber
printf %"s\n" hello world
- printf akan menggunakan kembali format jika terlalu banyak argumen diberikanecho
kebetulan mendukung-e
opsi.echo
,-e
baru saja dicetak dalam output itu sendiri jadi saya pikir jawaban ini sangat valid karenaecho
tidak konsisten di sini (kecuali kita berbicara tentang versi tertentu).Apakah Anda yakin berada dalam bash? Bekerja untuk saya, keempat cara:
sumber
-e
param tidak ada di semua * nix OScetakan
$''
string menggunakan ANSI C Mengutip :sumber
Anda selalu bisa melakukannya
echo ""
.misalnya
sumber
echo ""
bekerja untuk saya dan saya pikir itu adalah bentuk paling sederhana untuk mencetak baris baru, bahkan jika ini tidak langsung menjawab pertanyaan. Bersulang.echo -en "\n"
.echo
cukup untuk mendapatkan saluran kosongMencoba
bekerja untuk saya di
nano
editor.Dari halaman manual:
sumber
Jika ada seseorang yang membenturkan kepalanya ke dinding mencoba mencari tahu mengapa naskah rekan kerjanya tidak akan mencetak baris baru, perhatikan ini ->
Seperti pada contoh di atas, menjalankan aktual dari metode itu sendiri dapat dibungkus dalam gema yang menggantikan setiap gema yang mungkin ada dalam metode itu sendiri. Jelas saya mempermudah ini untuk singkatnya, tidak begitu mudah dikenali!
Anda kemudian dapat memberi tahu kawan-kawan Anda bahwa cara yang lebih baik untuk menjalankan fungsi adalah seperti ini:
sumber
Ini bekerja untuk saya di Raspbian,
sumber
POSIX 7 pada gema
http://pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html
-e
tidak didefinisikan dan backslash adalah implementasi didefinisikan:kecuali Anda memiliki ekstensi XSI opsional.
Jadi saya sarankan Anda harus menggunakan
printf
yang ditentukan dengan baik:yang File Format Notasi :
Perlu diingat juga bahwa Ubuntu 15.10 dan sebagian besar distro mengimplementasikan
echo
keduanya sebagai:help echo
which echo
yang dapat menyebabkan beberapa kebingungan.
sumber
Cukup ketik
untuk mendapatkan baris baru
sumber
sumber
Ini bekerja untuk saya di CentOS:
sumber
Anda juga dapat melakukan:
Ini berfungsi baik di dalam skrip dan dari baris perintah.
Di baris perintah, tekan Shift+ Enteruntuk melakukan jeda baris di dalam string.
Ini berfungsi untuk saya di macOS dan Ubuntu 18.04 saya
sumber
Satu lagi entri di sini untuk mereka yang tidak membuatnya bekerja dengan salah satu solusi ini, dan perlu mendapatkan nilai balik dari fungsinya:
Hanya trik ini yang berhasil di linux yang saya kerjakan dengan bash ini:
Semoga ini membantu seseorang dengan masalah serupa.
sumber
Skrip saya:
Keluaran:
Pada skrip bash saya, saya menjadi marah seperti Anda sampai saya baru saja mencoba:
Tekan saja enter di mana Anda ingin memasukkan lompatan itu. Output sekarang adalah:
sumber
Anda juga bisa menggunakan gema dengan kawat gigi,
sumber
echo hello; echo world
Ini bisa dilakukan sebagai
Opsi -e akan menginterpretasikan backslahes untuk urutan escape
-n opsi akan menghapus baris baru yang tertinggal di output
PS: gema perintah memiliki efek selalu menyertakan baris baru yang tertinggal dalam output sehingga -n diperlukan untuk mematikan hal itu (dan membuatnya kurang membingungkan)
sumber
Ada ekspansi parameter baru yang ditambahkan dalam urutan escape interpretasi:
bash 4.4
sumber
Jika Anda menulis skrip dan akan menggema baris baru sebagai bagian dari pesan lain beberapa kali, solusi lintas platform yang bagus adalah dengan meletakkan baris baru literal dalam variabel seperti:
sumber
Kadang-kadang Anda dapat melewati beberapa string yang dipisahkan oleh spasi dan itu akan ditafsirkan sebagai
\n
.Misalnya saat menggunakan skrip shell untuk pemberitahuan multi-baris:
sumber
\n
. Ini ditafsirkan sebagai argumen terpisah untuk program, dan program itu sendiri dapat menampilkan argumen itu pada baris baru, tetapi itu tidak berarti bahwa itu dikonversi ke\n
titik mana pun dan sepenuhnya tergantung pada program.Saya harus mengelilingi teks dengan tanda kutip ganda saat menggunakan sebagai alias di profil bash (MacOx, iTerm).
sumber
Ini membuat saya di sana ....
Hasil:
sumber
Saya hanya menggunakan gema tanpa argumen
sumber
Solusi tambahan:
Dalam beberapa kasus, Anda harus menggemakan multiline dari konten yang panjang (seperti kode / konfigurasi)
Sebagai contoh :
echo -e
,printf
mungkin memiliki beberapa batasanAnda dapat menggunakan beberapa karakter khusus sebagai pengganti sebagai
~
ganti baris (seperti ) dan menggantinya setelah file dibuat menggunakantr
perlu memanggil program lain (
tr
) yang seharusnya IMO baik-baik saja.sumber