Shell脚本打印包含命令输出的变量的内容将删除换行符

12 linux shell echo

我正在编写一个shell脚本,它将命令的输出存储在变量中,处理输出,然后回显结果.这是我得到的:

stuff=$(diff -u pens tape)
# process the output
echo $stuff
Run Code Online (Sandbox Code Playgroud)

问题是,我从运行脚本获得的输出是这样的:

--- 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
Run Code Online (Sandbox Code Playgroud)

虽然我期待这个:

--- 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
Run Code Online (Sandbox Code Playgroud)

看起来新行字符正在以某种方式被删除.我如何让他们说出来?

Jon*_*ler 23

如果要保留换行符,请将变量括在双引号中:

echo "$stuff"
Run Code Online (Sandbox Code Playgroud)

当你在没有双引号的情况下编写它时,shell会扩展$stuff为以空格分隔的单词列表(其中'words'是非空格字符的序列,空格字符是空格和制表符和换行符;在实验中,它似乎是换页,回车和后退空间不算作空间).


演示控制字符作为空白区域的解释.ASCII 8为退格键,9为tab,10为新行(LF),11为垂直制表符,12为换页符,13为回车符.第一个命令生成由各种控制字符分隔的字符序列.第二个命令与保留原始字符的结果相呼应 - 请参阅十六进制转储.第三个命令回应结果,shell分裂了单词; 你可以看到标签和换行符被空格(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:
$ 
Run Code Online (Sandbox Code Playgroud)