web-dev-qa-db-ja.com

シェルスクリプトで改行なしの 'echo'

私のスクリプトでechoに問題があります。

echo -n "Some string..."

版画

-n Some string...

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

Some string...
431
qwertz

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

printfコマンドは、より一貫した振る舞いをします。 echoecho helloのような単純なことには問題ありませんが、もっと複雑なことにはprintfを使うことをお勧めします。

あなたはどんなシステムを使っていますか、そしてあなたのスクリプトはどんなシェルを使っていますか?

461
Keith Thompson

bashname__には、 "echo"という "組み込み"コマンドがあります。

$ type echo
echo is a Shell builtin

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

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

echoname__の\cおよび-nに対するWRTの動作はさまざまです。最善の策は、printfname__を使用することです。これは、私が見た4つの異なる* NIXフレーバーで使用可能です。

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

で試してみる

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

それは期待通りに私のために働きます(あなたの質問から私が理解したように)。

manページからこの情報を得たことに注意してください。 manページはまた、シェルがそれ自身のバージョンのechoを持っているかもしれないことに注意しています、そして私はbashがそれ自身のバージョンを持っているかどうかはわかりません。

81
Sonny

"read"のような他のコマンドでifの内側にechoを使用すると、設定を無視し、とにかく新しい行にジャンプします。

2

あなたが行ってあなたを書くとき、シェルスクリプトは常に#!/ usr/bin/env bashのように最初の行を置きます。このシェルはエスケープシーケンスを省略または操作しません。 ex echo "これは最初の行です"これは最初の行です。

0
Amit Singh

だけでなく最も人気のあるlinuxUbuntubash

  1. どのシェルを使用していますか?以下のほとんどがうまくいきます、そうでなければ これを見てください

    echo $0

  2. 上記がbashを表示するならば、以下はうまくいくでしょう:

    printf "hello with no new line printed at end"
    または
    echo -n "hello with no new line printed at end"