web-dev-qa-db-ja.com

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

Bashでは、これを試してみました:

echo -e "hello\nworld"

しかし、それは改行を表示せず、\nのみを出力します。改行を印刷するにはどうすればいいですか。

Ubuntu 11.04を使っています。

1954
Sergey

代わりにprintfを使用することもできます。

printf "hello\nworld\n"

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

2399
sth

あなたは不意を突いていますか?私のために働く、3つすべての方法:

echo -e "Hello\nworld"
echo -e 'Hello\nworld'
echo Hello$'\n'world
1473
choroba
echo $'hello\nworld'

版画

hello
world

$''文字列は ANSI C引用符を使用

形式$'string'の単語は特別に扱われます。御言葉は ひもANSI C規格で指定されているように、バックスラッシュでエスケープされた文字が置き換えられます。

498
Vanuan

いつでもecho ""を実行できます。

例えば.

echo "Hello"
echo ""
echo "World"
115
Nayeem Zen

なぜ同僚の台本が改行を印刷しないのかを突き止めようとして、誰かが自分の頭を壁にぶつけているのに気付く可能性があるので、この点に注意してください - >

#!/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;
39
Uncle Iroh

やってみる

echo -e "hello\nworld"
hello
world

私はナノエディタで働いていました。

33
Harsha Biyani

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

echo -e "hello\\nworld"
20
Sathesh
str='hello\nworld'
$ echo | sed "i$str"
hello
world
15
alinsoar

エコー時の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

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

それはCentOSで私のために働きます:

echo -e ""hello\nworld""
8
vanishedzhou

これらの解決策のどれともうまくいかなかった、そしてそれらの関数から戻り値を得る必要がある人たちのためのもう一つのエントリがここにあります:

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
DNT

次のこともできます。

echo "hello
world"

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

これは私のmacOSと私のUbuntu 18.04で私のために働きます

4
vinzee

これはよりよくすることができます

x="\n"
echo -ne $x

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

シモンズ:コマンドechoは出力の末尾の改行を常に含む効果があるので、-nはそれをオフにするために必要です(そして混乱を少なくするため)。

3
Dhwanit

私のスクリプト:

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"

そのジャンプを挿入したい場所にエンターキーを押すだけです。今出力されます:

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

エコーを中括弧とともに使用することもできます。

$ (echo hello; echo world)
hello
world
2
Avinash Raj

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

たとえば、複数行の通知にシェルスクリプトを使用する場合は、次のようになります。

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

エスケープシーケンスを解釈するnewパラメータ展開bash 4.4に追加されました。

${parameter@operator} - E operator

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

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

場合によっては、長いコード(コードなど)をenv var連結でエコーする必要があり、単純にしたいと考えました。

echo -eprintfには制限があるかもしれません

改行のプレースホルダーとして特殊な文字を使用できます(~など)

そしてこれを試してください:

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

それは素晴らしいIMOであるべきである別のプログラム(tr)を呼び出す必要があります。

0
ZenithS

単純タイプ

エコー

改行する

0
SiteTester

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

newline='
'

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

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

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