Echo baris baru di Bash mencetak literal \ n

2365

Di Bash, coba ini:

echo -e "hello\nworld"

Tapi itu tidak mencetak baris baru, hanya \n. Bagaimana saya bisa membuatnya mencetak baris baru?

Saya menggunakan Ubuntu 11.04.

Sergey
sumber
264
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.

sth
sumber
49
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:

echo -e "Hello\nworld"
echo -e 'Hello\nworld'
echo Hello$'\n'world
echo Hello ; echo world
choroba
sumber
368
-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
csga5000
578
echo $'hello\nworld'

cetakan

hello
world

$''string menggunakan ANSI C Mengutip :

Kata-kata dalam bentuk diperlakukan secara khusus. Kata diperluas ke string , dengan karakter backslash-escaped diganti sebagaimana ditentukan oleh standar ANSI C.$'string'

Vanuan
sumber
15
@ 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'`
Kamafeather
141

Anda selalu bisa melakukannya echo "".

misalnya

echo "Hello"
echo ""
echo "World"
Nayeem Zen
sumber
6
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".
DBedrenko
72
echocukup untuk mendapatkan saluran kosong
ROMANIA_engineer
5
@ Okneloper Bekerja dengan baik untuk saya.
Matius Baca
71

Mencoba

echo -e "hello\nworld"
hello
world

bekerja untuk saya di nanoeditor.

Dari halaman manual:

-e memungkinkan interpretasi lolos backslash

Harsha Biyani
sumber
41

Jika ada seseorang yang membenturkan kepalanya ke dinding mencoba mencari tahu mengapa naskah rekan kerjanya tidak akan mencetak baris baru, perhatikan ini ->

#!/bin/bash
function 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/bash
function GET_RECORDS()
{
   echo -e "starting\n the process";
}

GET_RECORDS;
Paman Iroh
sumber
Pastikan Anda membungkus variabel dengan tanda kutip sebelum mengeluarkannya dari metode.
ingyhere
23

Ini bekerja untuk saya di Raspbian,

echo -e "hello\\nworld"
Sathesh
sumber
2
Bekerja untuk saya di GitBash pada Windows 7, juga ;-)
Big Rich
3
Satu backslash seharusnya cukup
Felix D.
23

POSIX 7 pada gema

http://pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html

-e tidak didefinisikan dan backslash adalah implementasi didefinisikan:

Jika operan pertama adalah -n, atau jika salah satu operan berisi karakter <backslash>, hasilnya ditentukan oleh implementasi.

kecuali Anda memiliki ekstensi XSI opsional.

Jadi saya sarankan Anda harus menggunakan printfyang ditentukan dengan baik:

format operan harus digunakan sebagai format string yang dijelaskan dalam Notasi Format File XBD [...]

yang File Format Notasi :

\ n <newline> Pindahkan posisi pencetakan ke awal baris berikutnya.

Perlu diingat juga bahwa Ubuntu 15.10 dan sebagian besar distro mengimplementasikan echokeduanya sebagai:

  • built-in Bash: help echo
  • executable mandiri: which echo

yang dapat menyebabkan beberapa kebingungan.

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
sumber
17

Cukup ketik

echo

untuk mendapatkan baris baru

R Sun
sumber
3
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
alinsoar
sumber
Ini sebenarnya jawaban yang bagus karena ini berfungsi untuk rangkaian senar. Bagus!
LavaScornedOven
1
Mengapa repot-repot menjalankan program kedua? Bukannya kami mencoba untuk menulis aplikasi waktu nyata di bash;) tetapi itu tidak perlu.
Felix D.
ini benar-benar jawaban yang bagus yang harus bekerja di mana pun tidak peduli apa. Anda menyelamatkan teman saya hari @alinsoar
Kashyap Kotak
8

Ini bekerja untuk saya di CentOS:

echo -e ""hello\nworld""
vanishedzhou
sumber
6

Anda juga dapat melakukan:

echo "hello
world"

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

vinzee
sumber
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.

DNT
sumber
4

Skrip saya:

echo "WARNINGS: $warningsFound WARNINGS FOUND:\n$warningStrings

Keluaran:

WARNING : 2 WARNINGS FOUND:\nWarning, found the following local orphaned signature file:

Pada skrip bash saya, saya menjadi marah seperti Anda sampai saya baru saja mencoba:

echo "WARNING : $warningsFound WARNINGS FOUND:
$warningStrings"

Tekan saja enter di mana Anda ingin memasukkan lompatan itu. Output sekarang adalah:

WARNING : 2 WARNINGS FOUND:
Warning, found the following local orphaned signature file:
TanisDLJ
sumber
4
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,

$ (echo hello; echo world)
hello
world
Avinash Raj
sumber
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)

Dhwanit
sumber
echo -ne "hello \ nworld" untuk jawaban pasti dari pertanyaan :)
Dhwanit
3

Ada ekspansi parameter baru yang ditambahkan dalam urutan escape interpretasi:bash 4.4

${parameter@operator} - E operator

Ekspansi adalah string yang merupakan nilai parameter dengan urutan escape backslash diperluas sebagaimana dengan $'…'mekanisme penawaran.

$ foo='hello\nworld'
$ echo "${foo@E}"
hello
world
Pesa
sumber
2

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
skiggety
sumber
0

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:

#!/bin/bash
notify-send 'notification success' 'another line' 'time now '`date +"%s"`
Hunter Frazier
sumber
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).

alias helloworld="echo -e \"hello \n world\""
John Jai
sumber
0

Ini membuat saya di sana ....

outstuff=RESOURCE_GROUP=[$RESOURCE_GROUP]\\nAKS_CLUSTER_NAME=[$AKS_CLUSTER_NAME]\\nREGION_NAME=[$REGION_NAME]\\nVERSION=[$VERSION]\\nSUBNET-ID=[$SUBNET_ID]
printf $outstuff

Hasil:

RESOURCE_GROUP=[akswork-rg]
AKS_CLUSTER_NAME=[aksworkshop-804]
REGION_NAME=[eastus]
VERSION=[1.16.7]
SUBNET-ID=[/subscriptions/{subidhere}/resourceGroups/makeakswork-rg/providers/Microsoft.Network/virtualNetworks/aks-vnet/subnets/aks-subnet]
Joe Healy
sumber
-1

Saya hanya menggunakan gema tanpa argumen

echo "Hello"
echo
echo "World"
Xenon
sumber
-2

Solusi tambahan:

Dalam beberapa kasus, Anda harus menggemakan multiline dari konten yang panjang (seperti kode / konfigurasi)

Sebagai contoh :

  • Skrip Bash untuk menghasilkan kode / konfigurasi

echo -e, printfmungkin memiliki beberapa batasan

Anda dapat menggunakan beberapa karakter khusus sebagai pengganti sebagai ~ganti baris (seperti ) dan menggantinya setelah file dibuat menggunakantr

echo ${content} | tr '~' '\n' > $targetFile

perlu memanggil program lain ( tr) yang seharusnya IMO baik-baik saja.

ZenithS
sumber