最初のパイプ操作で改行文字が削除されないのはなぜですか?

最初のパイプ操作で改行文字が削除されないのはなぜですか?

私の行nextermCensus.lisには改行文字が含まれています。私は最初の行だけに興味があります。改行文字を削除したいです。しかし、うまくいきません。したがって、2番目の方法を使用して削除する必要があります。 $(echo $census_day | tr -d '\n')期待どおりに動作します。しかし、私は一行にするのが大好きです。

census_day=`head -1 /dr4/home/operbat/batches/nextermCensus.lis | tr -d '\n'`
census_day=$(echo $census_day | tr -d '\n')

答え1

注文する:

bla=`head -1 filename`

改行が削除されました。このechoコマンドは改行文字を再追加します。

努力する:

echo "$bla\c"

(POSIX互換エコーを使用している場合)が表示されます$bla

答え2

デフォルトでは、末尾のecho改行文字は印刷する文字列または変数に追加されます。最初のコマンドは完全に機能します。そこに改行文字はありません。コマンドの置き換え(`...`またはそれに対応する最新のコマンド$(...))は、すべての末尾の改行文字を削除します。変数を使用しようとした場合にのみ追加されますecho

たとえば、次のファイルが提供されます。

$ cat foo.txt
a
b
c

以下を使用して、改行文字を除く最初の行を保存できますhead

$ census_day=`head -n 1 foo.txt`

これでこれを行うと改行文字が表示されますが、または(これをサポートするsの場合)をecho使用すると、次のような内容は表示されません。 printfecho -necho

$ printf %s "$census_day" | od -tc
0000000   a
0000001

関連情報