シェルスクリプトで改行なしの「エコー」


541

echoスクリプトに問題があります:

echo -n "Some string..."

プリント

-n Some string...

次の行に移動します。コンソールでは、改行なしで正しく動作しています:

Some string...

2
どのボーンシェル実装を使用していますか?bashボーンシェルモードで実行すると、ここでは問題なく動作します。また、インタラクティブシェルとしてボーンシェルを実際に使用している可能性は少しありますね。
FatalError

4
Ubuntuの場合:echo -ne "text without new line: "; echo "some text";
zsoltii

これは非常に古いことを知っていますが、Windows 10では、改行なしでピリオドを追加することで機能します。/ p = "を設定します。"
SPlatten

回答:


574

echoコマンドには複数のバージョンがあり、動作が異なります。どうやら、スクリプトに使用されているシェルはを認識しないバージョンを使用してい-nます。

printfコマンドは、はるかに一貫性のある行動を持っています。echoのような単純なものには問題echo helloありませんが、printfもっと複雑なものには使用することをお勧めします。

どのシステムを使用していて、スクリプトはどのシェルを使用していますか?


46
ラインから始めることで、#!/bin/bashうまくいきました。通常はbashを使用しています。
qwertz

私はちょうど同じ動作を実現するために回避策、そこにはありませんが、Windowsの当量がはるかに私が見ることができるようCMD :(ようであったことを望む。
kayleeFrye_onDeck

2
@kayleeFrye_onDeck:printfコマンドのWindowsバージョンがあるかもしれません。
キーストンプソン

私は望む。echo常に改行を追加します...回避策はせいぜいぎこちないです。
kayleeFrye_onDeck

2
@alper %はシェルプロンプトです。これを試してみて、そして慎重に見て:printf hello; sleep 5
キース・トンプソン

150

bash 「echo」と呼ばれる「組み込み」コマンドがあります。

$ type echo
echo is a shell builtin

さらに、適切な実行可能ファイルである「echo」コマンドがあります(つまり、それ/bin/echoを解釈echoして実行するのではなく、シェルフォークとexecです)。

$ ls -l /bin/echo
-rwxr-xr-x 1 root root 22856 Jul 21  2011 /bin/echo

いずれかの行動echoへのWRT \cとは-n異なります。あなたの最善の策はprintf、私が調べた4つの異なる* NIXフレーバーで利用可能なを使用することです。

$ printf "a line without trailing linefeed"
$ printf "a line with trailing linefeed\n"

3
非常に詳細な回答をありがとう!
Darth Egregious

91

で試す

echo -e "Some string...\c"

期待どおりに機能します(質問から理解できました)。

この情報はmanページから取得したことに注意してください。このmanページでは、シェルにの独自のバージョンがある可能性があることも示されています。独自のバージョンがあるechoかどうかbashはわかりません。


正しい方向に私をほのめかすための+1。ただし、-neオプションを認識しないエコーはおそらく-e(または必要なし)オプションも認識しないので、echo "some string...\c"代わりに言いたいだけでしょう。ただし、大きく異なるエコーコマンドを使用して複数のbashバリアントをサポートする必要がある場合は、おそらくprintfを使用するか、次のようなものでエコーコマンド機能を確認する必要があります[ -n "$( echo -e )" ] && echo "sh stuff\c" || echo -e "bash stuff\c"(少なくともbashは\ cもサポートしているため、 -nオプション、ただしbashには-eが必要です)
Timo

私にとって、これはOPの場合に-nが行うこととまったく同じです。printfは確かにより一貫していると思います
aexl

-eはposixシェルスクリプトでは機能せず、代わりに画面に出力されます。
Thomas Dignan

7

これを達成するには、基本的に私が頻繁に使用する2つの方法があります。

1.使用してカーソルのエスケープ文字(\c)とをecho -e

for i in {0..10..2}; do
  echo -e "$i \c"              
done
# 0 2 4 6 8 10
  • -eフラグは、文字列内のEエスケープ文字を有効にします。
  • \cもたらしCの現在の行にursorバックを。

または

2.printfコマンドの使用

for ((i = 0; i < 5; ++i)); do
  printf "$i "
done
# 0 1 2 3 4



1

私は今あなたの出力印刷が以下のように信じています

~ echo -e "String1\nString2"
String1
String2

を使用xargsして、複数行の標準出力を同じ行に入れることができます。

 ~ echo -e "String1\nString2" | xargs
String1 String2

 ~

0

シェルスクリプトを作成して作成するときは、常に最初の行を#!/ usr / bin / env bashとしてください。このシェルは、エスケープシーケンスを省略または操作しません。ex echo "これは最初の\ n行です"と出力しますこれは最初の\ n行です。


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