2013-01-09 88 views

回答

12

您需要引用您的变量$res以便保留空白。

$ cat file 
a  b e  c  d 

$ res=$(cat file) 

$ echo $res 
a b e c d 

$ echo "$res" 
a  b e  c  d 

man bash从下QUOTING

引用被用于去除某些字符 或词语的特殊含义的壳。 引用可用于禁用对特殊字符的特殊处理,以防止保留字被识别,并防止参数扩展。

上面在DEFINITIONS下列出的每个元字符对shell 有特殊含义,如果要表示它自己,则必须引用它们。

... 

\a  alert (bell) 
\b  backspace 
\e 
\E  an escape character 
\f  form feed 
\n  new line 
\r  carriage return 
\t  horizontal tab 
\v  vertical tab 
\\  backslash 
\'  single quote 
\"  double quote 
\nnn the eight-bit character whose value is the octal value nnn 
\xHH the eight-bit character whose value is the hexadecimal value HH 
\cx a control-x character 

... 
4

这不是唯一的失败的标签,但是调用echo命令的分配。

res被分配一个包含制表符的值。当你在shell中编写$res这就相当于在那个时候输入res变量的内容。

所以:

$ echo $res 

不一样:

$ echo a b e  c  d 

(其中在该行的大空间是制表符,它可以通过按Ctrl+V Tab键入)。如果你运行该命令你也可以得到:

a b e c d 

所以你的问题居然是:为什么标签失踪的命令的参数呢?

答案是命令(在这种情况下为echo)永远不会看到选项卡或实际上的空间。 shell将您的命令行解析为命令名称和参数列表。它使用空格(制表符和空格)将命令拆分成这些部分。然后它运行命令,将参数列表传递给它。

所以echo收到的是列表'a','b','e','c','d'。它不知道什么字符最初将它们分开。

然后echo然后输出它的每个参数,它们之间有一个空格。因此你看到的输出。在原始命令行使用单个空格字符分隔每个参数的情况下,输出与输入相匹配,因此它看起来很像输入中的空格也在输出中 - 但它们不是:shell将原始空格和echo插入一些新的。

引用标记可用于使shell将多个“单词”视为单个参数。例如,如果你这样做:

$ echo a "b c" d 

是通过3个参数echo:“A”,“B C”和“d”。中间参数包含4个空格;那些得到传递到echo,所以会出现在它的输出。引号外的空格被shell用于分割参数,所以不会传递给echo。因此,输出是:

a b c d 

要检查这种东西它更清晰使用一个命令,它显示你到底有多少争论收到,什么是他们每个人。这个Perl单线程将做到这一点:

$ perl -MData::Dumper -E 'say Dumper \@ARGV' a b c d 
$VAR1 = [ 
      'a', 
      'b', 
      'c', 
      'd' 
     ]; 

$ perl -MData::Dumper -E 'say Dumper \@ARGV' "a b c d" 
$VAR1 = [ 
      'a b c d' 
     ]; 

$ perl -MData::Dumper -E 'say Dumper \@ARGV' a "b c" d 
$VAR1 = [ 
      'a', 
      'b c', 
      'd' 
     ]; 

$ res="a b c  d" 
$ perl -MData::Dumper -E 'say Dumper \@ARGV' $res 
$VAR1 = [ 
      'a', 
      'b', 
      'c', 
      'd' 
     ]; 

$ perl -MData::Dumper -E 'say Dumper \@ARGV' "$res" 
$VAR1 = [ 
      'a b c  d' 
     ]; 
+0

哦,谢谢@Smylers too.Your点也是对的。 – MoreFreeze

相关问题