Bashのエコー改行はリテラルを印刷します\ n


2363

バッシュでこれを試しました:

echo -e "hello\nworld"

ただし、改行は出力されません\n。改行を印刷させるにはどうすればよいですか?

Ubuntu 11.04を使用しています。


264
「それは私にとってはうまくいく」と言う人にとって、エコーの動作はバージョン間でかなり異なります。一部のユーザーは、出力の一部として「-e」を出力します。些細なことに対して予測可能な動作が必要な場合は、代わりにprintfを使用してください(@sthの回答のように)。
Gordon Davisson、2011

6
私は得ることができなかったすべてのことが判明したとして、私は機能でそれを使用しようとしていた、ので、この答えの作業で提案のが値を返すと、関数内のすべてのエコー(とprintfの)メッセージがに追加されていました改行を個別に取り除いた後の戻り値。これに関する質問で、非常に徹底した回答があります:stackoverflow.com/questions/27872069/…これは、3時間のミステリーツアーのようなものでした。
aliteralmind 2015年

8
また注目に値する:Unix&Linux Stack Exchangeで、echoを使用するときに新しい行を追加する方法に対する承認済みの回答
Graham Perrin

@GrahamPerrin、本当に非常に良い詳細な回答へのリンクに感謝します!以下の答えよりも良いと思います。
コンスタンティン

2
echo -ne "hello \ nworld"(エスケープを解釈するにはnフラグが必要でした)-しかし、他の人が言うように、異なるechoコマンドは異なる結果をもたらす可能性があります!
Konchog 2018年

回答:


2878

printf代わりに使用できます:

printf "hello\nworld\n"

printfはよりも一貫した動作をしechoます。の動作は、echoバージョンによって大きく異なります。


49
またはprintf %"s\n" hello world--引数が多すぎる場合、printfはフォーマットを再利用します
glenn jackman '12 / 12/12

28
OPはprintfではなくechoについて尋ねました。また、-eオプションを使用する@chorobaの以下の回答は、請求書を完全に満たします。
JESii

57
@JESii:echoたまたま-eオプションをサポートしている場合に適しています。
STH

11
の一部のバージョンではecho-eは出力自体に出力されるだけなので、echoここでは一貫性がないため、この答えは完全に有効であると思います(特定のバージョンについて話している場合を除く)。
Tejas Manohar 2015年

14
これは、printfが使用可能な場合は適切ですが、echoとは異なり、printfがディストリビューションにない場合があります。
bigtunacan

1713

本当にバッシュですか?私にとっては、4つの方法すべてで機能します。

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

368
-eフラグは私のためにそれをしました、それは「バックスラッシュエスケープの解釈を可能にします」
タンディ

21
私が思うに-eparamは、すべての* nixのOS上に存在しない
kenorb

12
@kenorb:bashに存在します。組み込みです。
チョロバ2013

なぜ3つ目は機能するのですか?$がなければ、「He​​llo n world」を返します
Evan Donovan

21
他のさまざまな-eで述べたように、すべてのディストリビューションとバージョンで機能するわけではありません。無視される場合もあれば、実際に印刷される場合もあります。私はそう答え受理すべきではありませんOPのために、これは固定それを信じていない
csga5000

578
echo $'hello\nworld'

プリント

hello
world

$''文字列はANSI C引用を使用します:

フォームの単語は特別に扱われます。単語はstringに展開され、バックスラッシュでエスケープされた文字はANSI C規格の指定に従って置き換えられます。$'string'


15
@EvgeniSergeevどういう意味かわかりませんが、最初はうまくいきませんでした。そして、それは私が二重引用符を使用していて、これが単一引用符でのみ機能することが判明したためです!Macのターミナルで試してみました。
trss 2016年

11
文字列内の変数が展開されない問題。
willemdh 2016年

それでも二重引用符の文字列を連結できます。`foo =" bar "; echo $ '' $ foo'efoot'`
Kamafeather

141

いつでもできますecho ""

例えば

echo "Hello"
echo ""
echo "World"

6
echo ""私にとってはうまくいき、これが質問に直接答えられなくても、新しい行を印刷するのが最も簡単なフォームだと思います。乾杯。
Mario Awad 2014年

2
私はそれがほど明白ではない(したがって、混乱を招く可能性がある)と思いますecho -en "\n"
DBedrenko 2014

72
echo空の行を取得するのに十分です
ROMANIA_engineer '25年

5
@Okneloperは私には問題なく動作します。
マシューは

71

試す

echo -e "hello\nworld"
hello
world

nanoエディターで働いた。

manページから:

-e バックスラッシュエスケープの解釈を有効にする


41

誰かが壁に頭をぶつけて同僚のスクリプトが改行を印刷しない理由を理解しようとしていることに気づいたときは、これに注意してください->

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

echo $(GET_RECORDS);

上記のように、メソッドの実際の実行自体は、メソッド自体に存在する可能性のあるエコーに取って代わるエコーにラップされる場合があります。明らかに、私は簡潔にするためにこれを骨抜きにしました、それを見つけるのはそれほど簡単ではありませんでした!

次に、仲間に、関数を実行するためのより良い方法は次のようになることを通知できます。

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

GET_RECORDS;

メソッドから変数をエコーする前に、変数を引用符で囲んでください。
2016

23

これはRaspbianで私のために働きます、

echo -e "hello\\nworld"

2
Windows 7のGitBashでも機能します;-)
Big Rich

3
バックスラッシュは1つで十分です
FelixD。

23

エコーに関するPOSIX 7

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

-e は定義されておらず、円記号は実装で定義されています。

最初のオペランドが-nの場合、またはいずれかのオペランドに<backslash>文字が含まれている場合、結果は実装定義です。

オプションのXSI拡張がない限り。

したがってprintf、代わりに使用することをお勧めします。

formatオペランドは、XBDファイル形式表記[...]で説明されている形式文字列として使用されます。

ファイル形式の表記

\ n <改行>印刷位置を次の行の先頭に移動します。

また、Ubuntu 15.10とほとんどのディストリビューションはecho、次のように両方を実装しています。

  • bash組み込み: help echo
  • スタンドアロンの実行可能ファイル: which echo

混乱を招く可能性があります。


17

入力するだけ

echo

新しいラインを取得する


3
非常に過小評価されている回答ですが、この質問が2011年以来20以上の回答を集めているとは信じられません。
Prometheus

エイリアスc = 'echo; エコー ; エコー ; エコー ; エコー ; エコー ; エコー ; エコー ; エコー ; エコー ; エコー ; エコー ; エコー ; エコー ; エコー ; エコー ; エコー ; エコー ; エコー ; エコー ; エコー ; エコー ; エコー ; エコー ; エコー ; エコー ; エコー ; エコー ; エコー ; エコー ; エコー ; エコー ; エコー ; エコー ; エコー ; エコー ;' これが私が画面をクリアできる唯一の方法です、ありがとう!
Ahi Tuna

@Ahi Tuna:代わりにコンソールのキーボードショートカットを使用してください:)
R Sun

@RSunとChromebookのDebianターミナルウィンドウでそれを行うにはどうすればよいですか?
Ahi Tuna

1
@AhiTunaクリア; またはctrl + l;
Mike Seeds

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

これは文字列の連結に対して機能するため、実際には素晴らしい答えです。すごい!
LavaScornedOven 2013年

1
なぜわざわざ2番目のプログラムを呼び出すのですか?リアルタイムアプリケーションをbash;)で記述しようとしているわけではありませんが、必須ではありません。
Felix D.

これは本当に良い答えであり、何があってもどこでも機能するはずです。あなたは私の日友達@alinsoarを保存しました
Kashyap


6

あなたも行うことができます:

echo "hello
world"

これは、スクリプト内でもコマンドラインからでも機能します。
コマンドラインでShift+ Enterを押して、文字列内で改行します。

これは私のmacOSとUbuntu 18.04で動作します


「nter」キーを押したときにシェルにコマンドを実行させずに、どのように改行を入力しますか?
Xenos 2018

@Xenosこれはスクリプトでうまく機能します。そしてコンソールで、Shift + Enterをクリックして新しい行を追加し、シェルが未完了のコマンドを実行しないようにします。
-vinzee

5

これらのソリューションで機能せず、関数から戻り値を取得する必要があるユーザーのために、もう1つのエントリがあります。

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

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

このトリックだけが、私がこのbashで作業していたLinuxで機能しました。

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

それが同様の問題を持つ誰かを助けることを願っています。


4

私のスクリプト:

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

出力:

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

私のbashスクリプトでは、試してみるまであなたと同じように怒っていました。

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

ジャンプを挿入したい場所でEnterキーを押すだけです。出力は次のとおりです。

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

4
ただし、シェルが$ warningsFoundと呼ばれる変数を見つけてそれを出力するときに、2つの別々の出力ではなく、変数名の周りで$ {}を使用すると、本当に奇妙な動作が発生する可能性があります。
dragon788

@ dragon788何か足りないかもしれませんが、変数は実際には$ warningsFoundと呼ばれていますか?
psynnott 2017

2
それについて一言も聞き逃しました。$ warningsという変数がある場合、場合によっては$ {warningsFound}を使用せずに、意図した変数の代わりに$ warnings + "Found"の内容で終了する可能性があります。
dragon788

3

中かっこでエコーを使用することもできます。

$ (echo hello; echo world)
hello
world

.shファイルで呼び出されたときに予期しないトークン `( 'に近い構文エラー
cosbor11

1
試してみるecho hello; echo world
Avinash Raj 2015

1
または "echo hello && echo world"または単に: "echo hello echo world
csga5000

3

これは、

x="\n"
echo -ne $x

-eオプションはエスケープシーケンスのバックスラッシュを解釈します
-nオプションは出力の末尾の改行を削除します

PS:コマンドエコーには、出力の末尾に常に改行が含まれるという効果があるため、そのことをオフにする(混乱を少なくする)には-nが必要です。


echo -ne "hello \ nworld"で質問の正確な回答を確認できます:)
Dhwanit

3

エスケープシーケンスを解釈する新しい パラメーター拡張が追加されbash 4.4ています。

${parameter@operator} - E operator

展開は、$'…'引用メカニズムと同様に展開されたバックスラッシュエスケープシーケンスを含むパラメーターの値である文字列です。

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

2

スクリプトを作成していて、他のメッセージの一部として改行を数回エコーする場合、優れたクロスプラットフォームソリューションは、次のようにリテラルの改行を変数に入れることです。

newline='
'

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

0

時々、スペースで区切られた複数の文字列を渡すことができ、それはとして解釈され\nます。

たとえば、複数行の通知にシェルスクリプトを使用する場合:

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

これは誤りです。と解釈されることはありません\n。これはプログラムへの個別の引数として解釈され、プログラム自体がその引数を新しい行に表示する場合がありますが、それは\nいつでも変換され、プログラムに完全に依存しているという意味ではありません。
Score_Under

0

bashプロファイル(MacOx、iTerm)でエイリアスとして使用している間、テキストを二重引用符で囲む必要がありました。

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

0

これは私をそこに連れて行った....

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

収量:

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]


-2

追加のソリューション:

場合によっては、長いコンテンツ(コード/構成など)の複数行をエコーする必要があります。

例えば ​​:

  • コード/構成を生成するBashスクリプト

echo -eprintfいくつかの制限があるかもしれません

特別な文字をプレースホルダーとして改行(など~)として使用し、ファイルを使用して作成した後で置き換えることができます。tr

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

別のプログラム(tr)を呼び出す必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.