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.
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.
Jawaban:
Anda bisa menggunakan printf
:
printf "hello\nworld\n"
printf
memiliki perilaku yang lebih konsisten daripada echo
. Perilaku echo
sangat bervariasi antara versi yang berbeda.
printf %"s\n" hello world
- printf akan menggunakan kembali format jika terlalu banyak argumen diberikan
echo
kebetulan mendukung -e
opsi.
echo
, -e
baru saja dicetak dalam output itu sendiri jadi saya pikir jawaban ini sangat valid karena echo
tidak konsisten di sini (kecuali kita berbicara tentang versi tertentu).
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
-e
param tidak ada di semua * nix OS
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'
Anda selalu bisa melakukannya echo ""
.
misalnya
echo "Hello"
echo ""
echo "World"
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 kosong
Mencoba
echo -e "hello\nworld"
hello
world
bekerja untuk saya di nano
editor.
Dari halaman manual:
-e
memungkinkan interpretasi lolos backslash
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;
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 printf
yang 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 echo
keduanya sebagai:
help echo
which echo
yang dapat menyebabkan beberapa kebingungan.
Cukup ketik
echo
untuk mendapatkan baris baru
str='hello\nworld'
$ echo | sed "i$str"
hello
world
Ini bekerja untuk saya di CentOS:
echo -e ""hello\nworld""
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
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.
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:
Anda juga bisa menggunakan gema dengan kawat gigi,
$ (echo hello; echo world)
hello
world
echo hello; echo world
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)
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
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
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"`
\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.
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]
Solusi tambahan:
Dalam beberapa kasus, Anda harus menggemakan multiline dari konten yang panjang (seperti kode / konfigurasi)
Sebagai contoh :
echo -e
,
printf
mungkin 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.