2013-01-09 109 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

相關問題