Bash'teki yankı satırsonu yazdırır \ n


2363

Bash'de şunu denedi:

echo -e "hello\nworld"

Ancak, yalnızca yeni bir satır yazdırmaz \n. Yeni satırı yazdırmasını nasıl sağlayabilirim?

Ubuntu 11.04 kullanıyorum.


264
"Benim için çalışıyor" diyenler için yankı davranışı versiyonlar arasında biraz değişiyor. Hatta bazıları "-e" yi çıktılarının bir parçası olarak basar. Önemsiz bir şey için öngörülebilir davranış istiyorsanız, bunun yerine printf kullanın (@ sth'nin cevabında olduğu gibi).
Gordon Davisson

6
Ben alamadım herhangi Olarak çıkıyor, ben bir işlevde olduğu kullanmak için uğraş, çünkü bu yanıt çalışma yer alan önerilerden bir değer döner ve işlevinde tüm yankı (ve printf) mesajları eklenmiş ediliyordu yeni satırlardan ayrı ayrı soyulduktan sonra dönüş değeri . İşte bu konuda son derece kapsamlı bir cevapla bir soru: stackoverflow.com/questions/27872069/… Bu üç saatlik gizemli bir tur gibiydi.
aliteralmind

8
Ayrıca önemli: Unix & Linux Stack Exchange içinde kabul edilen cevap için yankı kullanırken yeni satırlar ekleme
Graham Perrin

@GrahamPerrin, gerçekten çok iyi ve ayrıntılı bir cevaba bağlantı için teşekkürler! Aşağıdaki cevaplardan daha iyi olduğunu düşünüyorum.
Konstantin

2
echo -ne "merhaba \ nworld" (kaçışları yorumlamak için n bayrağına ihtiyacın vardı) - ancak diğerlerinin söylediği gibi, farklı yankı komutlarının farklı sonuçları olabilir!
Konchog

Yanıtlar:


2876

Bunun printfyerine şunları kullanabilirsiniz :

printf "hello\nworld\n"

printfdaha tutarlı davranışı vardır echo. Davranışı echofarklı sürümler arasında büyük farklılıklar gösterir.


49
hatta printf %"s\n" hello worldçok fazla argüman verilirse printf formatı yeniden kullanacaktır
glenn jackman

28
OP, printf değil yankı hakkında sordu; ve @ choroba'nın -e seçeneğini kullanan aşağıdaki yanıtı, faturayı mükemmel bir şekilde doldurur.
JESii

57
@JESii: Seçeneği echodesteklemek için uygunsa -e.
sth

11
Bazı sürümleri ile echo, -eçıktıda sadece basılır, bu yüzden bu cevabın mükemmel bir şekilde geçerli olduğunu düşünüyorum çünkü echoburada tutarlı değil (belirli bir sürümden bahsetmedikçe).
Tejas Manohar

14
Printf mevcutsa bu iyi ve iyidir, ancak yankının aksine bazen printf dağıtımda değildir.
bigtunacan

1712

Bash'da olduğunuzdan emin misiniz? Benim için çalışıyor, dört yolun hepsi:

echo -e "Hello\nworld"
echo -e 'Hello\nworld'
echo Hello$'\n'world
echo Hello ; echo world

368
-e bayrağı "ters eğik çizgi kaçışlarının yorumlanmasını sağlar" benim için yaptı
tandy

21
Bence -eparam tüm * nix OS'de yok
kenorb

12
@kenorb: Bash'ta var. Bu bir yerleşiktir.
choroba

Üçüncüsü neden çalışıyor? $ Olmadan "Merhaba n dünya" döndürür
Evan Donovan

21
Çeşitli diğer tarafından belirtildiği gibi -e tüm dağıtımlar ve sürümleri için işe yaramaz. Bazı durumlarda göz ardı edilir, bazılarında ise gerçekte yazdırılır. Ben bu OP için sabit inanmıyorum bu yüzden cevap kabul edilmemelidir
csga5000

578
echo $'hello\nworld'

baskılar

hello
world

$''dizelerde ANSI C Alıntı kullanılır :

Formdaki kelimeler özel olarak ele alınır. Sözcük dizeye genişler , ters eğik çizgiden kaçan karakterler ANSI C standardında belirtildiği gibi değiştirilir.$'string'


15
@EvgeniSergeev Ne demek istediğinizden emin değilim, ama önce benim için de işe yaramadı. Çünkü çift tırnak kullanıyordum ve bu sadece tek tırnaklarla çalışıyor! Mac'te Terminal'de denedim.
trss

11
Dizedeki değişkenlerle ilgili sorunlar genişletilmiyor.
willemdh

Yine de çift tırnaklı dizeleri birleştirebilirsiniz. "foo =" bar "; echo $ '' $ foo'efoot ''
Kamafeather

141

Her zaman yapabilirsin echo "".

Örneğin

echo "Hello"
echo ""
echo "World"

6
echo ""benim için çalışıyor ve bu doğrudan soruyu cevaplamasa bile, yeni bir satır yazdırmanın en basit formudur. Şerefe.
Mario Awad

2
Bence bu daha az açık (ve dolayısıyla potansiyel olarak daha kafa karıştırıcı) echo -en "\n".
DBedrenko

72
echoboş bir satır elde etmek için yeterli
ROMANIA_engineer

5
@Okneloper Benim için iyi çalışıyor.
Matthew

71

Deneyin

echo -e "hello\nworld"
hello
world

nanoeditörde benim için çalıştı .

Man sayfasından:

-e ters eğik çizgi kaçışlarının yorumlanmasını etkinleştir


41

Birisinin bir iş arkadaşının senaryosunun neden yeni satırlar yazdırmayacağını anlamaya çalışırken başını duvara dövdüğünü fark etmesi durumunda, buna dikkat edin ->

#!/bin/bash
function GET_RECORDS()
{
   echo -e "starting\n the process";
}

echo $(GET_RECORDS);

Yukarıda olduğu gibi, yöntemin fiili çalışması, yöntemin kendisinde olabilecek herhangi bir yankının yerine geçen bir ekoya sarılabilir. Açıkçası bunu kısalık için suladım, fark etmek o kadar kolay değildi!

Daha sonra yoldaşlarınıza işlevleri yürütmenin daha iyi bir yolunun şöyle olacağını bildirebilirsiniz:

#!/bin/bash
function GET_RECORDS()
{
   echo -e "starting\n the process";
}

GET_RECORDS;

Yöntemin dışına çıkmadan önce değişkeni tırnak işareti ile sardığınızdan emin olun.
16'da

23

Bu benim için Raspbian'da çalışıyor,

echo -e "hello\\nworld"

2
Windows 7'de GitBash'te benim için de çalışıyor ;-)
Big Rich

3
Tek bir ters eğik çizgi yeterli olmalı
Felix D.

23

Eko üzerinde POSIX 7

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

-e tanımlanmamıştır ve ters eğik çizgiler uygulama olarak tanımlanmıştır:

İlk işlenen -n ise veya işlenenlerden herhangi biri <backslash> karakteri içeriyorsa, sonuçlar uygulama tanımlıdır.

isteğe bağlı bir XSI uzantınız yoksa.

Bu yüzden printfiyi belirlenmiş yerine, kullanmanızı öneririz :

biçim işlenen XBD Dosya Biçimi Gösterimi [...] 'de açıklanan biçim dizesi olarak kullanılacaktır

Dosya Formatı Gösterim :

\ n <newline> Baskı konumunu sonraki satırın başına götür.

Ayrıca Ubuntu 15.10 ve dağıtımların çoğunun şu şekilde uygulandığını unutmayın echo:

  • Dahili Bash: help echo
  • bağımsız bir yürütülebilir dosya: which echo

bazı karışıklıklara yol açabilir.


17

Basitçe yazın

echo

yeni bir hat almak


3
Büyük ölçüde önemsiz cevap, bu sorunun 2011'den beri 20'den fazla cevap topladığına ve bunlardan hiçbirinin bu basit çözümü içermediğine inanamıyorum.
Prometheus

takma ad c = 'eko; Eko ; Eko ; Eko ; Eko ; Eko ; Eko ; Eko ; Eko ; Eko ; Eko ; Eko ; Eko ; Eko ; Eko ; Eko ; Eko ; Eko ; Eko ; Eko ; Eko ; Eko ; Eko ; Eko ; Eko ; Eko ; Eko ; Eko ; Eko ; Eko ; Eko ; Eko ; Eko ; Eko ; Eko ; Eko ;' Ekranımı temizlememin tek yolu bu, teşekkürler!
Ahi Tuna

@Ahi Tuna: Lütfen bunun yerine konsol klavye kısayollarınızı kullanın :)
R Sun

@RSun ve bunu Chromebook'taki Debian terminal penceresinde nasıl yapabilirim?
Ahi Tuna

1
@AhiTuna açık; veya ctrl + l;
Mike Seeds

16
str='hello\nworld'
$ echo | sed "i$str"
hello
world

Dize birleştirmeleri için çalıştığı için bu aslında harika bir cevaptır. Harika!
LavaScornedOven

1
Neden ikinci bir program başlatmak için uğraşasınız ki? Bu bash;) gerçek zamanlı bir uygulama yazmaya çalışıyoruz değil ama gerekli değil.
Felix

bu gerçekten ne olursa olsun her yerde çalışması gereken harika bir cevap. Arkadaşım @alinsoar'ı kurtardın
Kashyap Kotak


6

Ayrıca şunları da yapabilirsiniz:

echo "hello
world"

Bu hem bir komut dosyasının içinde hem de komut satırından çalışır.
Komut satırında, dizenin içindeki satır sonlarını yapmak için Shift+ tuşuna basın Enter.

Bu benim macOS ve Ubuntu 18.04 benim için çalışıyor


Ènter` tuşuna bastığınızda kabuğu çalıştırmak zorunda kalmadan o satır sonunu nasıl yazıyorsunuz?
Xenos

@Xenos Bu bir komut dosyasında iyi çalışır. Ve konsolda, kabuğun bitmemiş komutu çalıştırmasını önlemek için yeni bir satır eklemek için Shift + Enter tuşlarına basın.
vinzee

5

Bu çözümlerden herhangi biriyle çalışmayan ve işlevlerinden bir dönüş değeri alması gerekenler için buraya bir giriş daha:

function foo()
{
    local v="Dimi";
    local s="";
    .....
    s+="Some message here $v $1\n"
    .....
    echo $s
}

r=$(foo "my message");
echo -e $r;

Sadece bu hile bu bash ile üzerinde çalıştığım bir linux'da çalıştı:

GNU bash, version 2.2.25(1)-release (x86_64-redhat-linux-gnu)

Umarım benzer problemi olan birine yardımcı olur.


4

Senaryom:

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

Çıktı:

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

Benim bash senaryomda, sadece denemeden önce senin gibi deliriyordum:

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

Sadece atlamayı eklemek istediğiniz enter tuşuna basın. Çıktı şimdi:

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

4
Sadece bir not, değişken adlarınızın etrafında $ {} kullanmak isteyeceksiniz, çünkü bir kabuk $ warningsFound adlı bir değişken bulduğunda gerçekten garip davranışlara yol açabilir ve bu iki ayrı çıktıyı yazdırmaz.
dragon788

@ dragon788 belki bir şey eksik, ama değişken IS aslında $ warningsFound denir?
psynnott

2
Bununla ilgili bir kelimeyi kaçırdım. $ Warnings adlı bir değişkeniniz varsa, bazı durumlarda $ {warningsFound} kullanmadan, istediğiniz değişken yerine $ warnings + "Found" içeriğiyle sonuçlanabilir.
dragon788

3

Yankıyı parantez ile de kullanabilirsiniz,

$ (echo hello; echo world)
hello
world

.sh

1
deneyinecho hello; echo world
Avinash Raj

1
Veya "echo hello && echo world" ya da sadece: "echo hello echo world
csga5000

3

Bu daha iyi yapılabilir

x="\n"
echo -ne $x

-e seçeneği kaçış dizisi için ters anahtarları yorumlar
-n seçeneği çıktıdaki sondaki yeni satırı kaldırır

PS: echo komutunun çıktıya her zaman bir satırsonu karakteri ekleme etkisi vardır, bu yüzden -n bu şeyi kapatmak (ve daha az kafa karıştırıcı) yapmak için gereklidir


echo -ne "merhaba \ nworld" sorunun tam cevabı için :)
Dhwanit

3

Bir yoktur yeni parametre genişleme ilave bash 4.4olduğunu yorumlayıp kaçış dizileri:

${parameter@operator} - E operator

Genişletme, $'…'tırnak işareti mekanizmasında olduğu gibi genişletilen ters eğik çizgi kaçış dizileriyle parametre değeri olan bir dizedir .

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

2

Komut dosyaları yazıyorsanız ve yeni satırları diğer iletilerin bir parçası olarak birkaç kez yankılayacaksanız, hoş bir çapraz platform çözümü, aşağıdaki gibi bir değişkene gerçek bir satırsonu koymaktır:

newline='
'

echo "first line$newlinesecond line"
echo "Error: example error message n${newline}${usage}" >&2 #requires usage to be defined

0

Bazen bir boşlukla ayrılmış birden fazla dize geçirebilirsiniz ve bu dizge olarak yorumlanır \n.

Örneğin, çok satırlı bildirimler için kabuk komut dosyası kullanırken:

#!/bin/bash
notify-send 'notification success' 'another line' 'time now '`date +"%s"`

Bu yanlış. Asla olarak yorumlanmaz \n. Program için ayrı bir argüman olarak yorumlanır ve programın kendisi bu argümanı yeni bir satırda görüntüleyebilir, ancak bu \nherhangi bir noktada dönüştürüldüğü ve tamamen programa bağımlı olduğu anlamına gelmez .
19'da

0

Bas profilinde (MacOx, iTerm) bir takma ad olarak kullanırken metni çift tırnak içine almak zorunda kaldım.

alias helloworld="echo -e \"hello \n world\""

0

Bu beni oraya getirdi ....

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

Verim:

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]

-1

Ben sadece echo no argüman kullanıyorum

echo "Hello"
echo
echo "World"

-2

Ek çözüm:

Durumlarda, uzun içeriğin çok satırlı yankısını yazmanız gerekir (kod / yapılandırma gibi)

Örneğin :

  • Kod / yapılandırma oluşturmak için bir Bash betiği

echo -e, printfbazı sınırlamaları olabilir

Bazı özel karakterleri yer tutucu olarak satır sonu (örneğin ~) olarak kullanabilir ve dosya kullanılarak oluşturulduktan sonra değiştirebilirsiniz.tr

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

trIMO olması gereken başka bir program ( ) çağırması gerekir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.