コマンドの出力を変数に格納し、出力を処理して、後で結果をエコーするシェルスクリプトを書いています。これが私が持っているものです:
stuff=$(diff -u pens tape)
# process the output
echo $stuff
問題は、スクリプトを実行して得られる出力は次のとおりです。
--- pens 2009-09-27 10:29:06.000000000 -0400 +++ tape 2009-09-18 16:45:08.000000000 -0400 @@ -1,4 +1,2 @@ -highlighter -marker -pencil -POSIX +masking +duct
私はこれを期待していましたが:
--- pens 2009-09-27 10:29:06.000000000 -0400
+++ tape 2009-09-18 16:45:08.000000000 -0400
@@ -1,4 +1,2 @@
-highlighter
-marker
-pencil
-POSIX
+masking
+duct
改行文字がなんとか削除されているようです。どうすれば彼らに言わせることができますか?
改行を保持する場合は、変数を二重引用符で囲みます。
echo "$stuff"
二重引用符なしで書き込むと、シェルは$stuff
をスペースで区切られた単語のリストに展開します(「words」は非スペース文字のシーケンスであり、スペース文字は空白とタブおよび改行です。実験では、フォームフィード、キャリッジリターン、バックスペースはスペースとしてカウントされないようです)。
空白としての制御文字の解釈を示します。 ASCII 8はバックスペース、9はタブ、10は改行(LF)、11は垂直タブ、12は改ページ、13はキャリッジリターンです。最初のコマンドは、区切られた文字のシーケンスを生成します。 2番目のコマンドは、元の文字が保持された結果でエコーします。16進ダンプを参照してください。3番目のコマンドは、シェルが単語を分割して結果をエコーします。タブと改行が空白( 0x20)。
$ x=$(./ascii 64 65 8 66 67 9 68 69 10 70 71 11 72 73 12 74 75 13 76 77)
$ echo "$x" | odx
0x0000: 40 41 08 42 43 09 44 45 0A 46 47 0B 48 49 0C 4A @A.BC.DE.FG.HI.J
0x0010: 4B 0D 4C 4D 0A K.LM.
0x0015:
$ echo $x | odx
0x0000: 40 41 08 42 43 20 44 45 20 46 47 0B 48 49 0C 4A @A.BC DE FG.HI.J
0x0010: 4B 0D 4C 4D 0A K.LM.
0x0015:
$