コマンドの出力を含む変数の内容を出力するシェル スクリプトは改行文字を削除します [重複]

StackOverflow https://stackoverflow.com/questions/1483721

  •  18-09-2019
  •  | 
  •  

質問

この質問にはすでに答えがあります:

コマンドの出力を変数に保存し、出力を処理し、後で結果をエコーするシェル スクリプトを作成しています。私が持っているものは次のとおりです。

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 スペースで区切られた単語のリストに変換します (「単語」はスペース以外の文字のシーケンスであり、スペース文字は空白、タブ、改行です。実験したところ、フォーム フィード、キャリッジ リターン、バック スペースはスペースとしてカウントされないようです)。


制御文字を空白として解釈する例を示します。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:
$ 
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top