Shell脚本打印变量内容,其中包含一个命令的输出,会删除换行符字符。

27 浏览
0 Comments

Shell脚本打印变量内容,其中包含一个命令的输出,会删除换行符字符。

我正在编写一个shell脚本,它将存储一个命令的输出结果到一个变量中,处理输出结果,然后再输出结果。以下是我的代码:

stuff=$(diff -u pens tape)
# 处理输出结果
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

看起来换行符被某种方式移除了。我应该怎样保留它们?

0
0 Comments

Shell脚本打印包含命令输出的变量内容会删除换行符的原因是,当不使用双引号将变量括起来时,shell会将变量$stuff扩展为以空格分隔的单词列表(其中'单词'是非空格字符的序列,空格字符是空格和制表符以及换行符;经过实验,换页符、回车和退格不计入空格)。

为了保留换行符,可以将变量用双引号括起来,如下所示:

echo "$stuff"

下面的示例演示了控制字符的解释方式,其中ASCII 8是退格,9是制表符,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   .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   .BC DE FG.HI.J
0x0010: 4B 0D 4C 4D 0A                                    K.LM.
0x0015:
$ 

Jonathan是正确的。原因是,否则shell会自动删除空格。

0