2014-01-15 154 views
0

我想從文件中讀取一個字符串,並將其打印如下字符串:閱讀從文件

LINE=tr '\n' ' ' < $FILENAME 
x1=$LINE 
echo $LINE 

但命令echo $LINE顯示一個空行?

+0

現在說這會給錯誤,不是嗎?使用命令替換。 – devnull

回答

2

前面已經指出的其他海報,到tr命令的輸出嵌入到另一個命令(在這種情況下, LINE=...),圍繞tr命令$(...)。在bash中,這被稱爲command substitution

LINE=$(tr '\n' ' ' < "$FILENAME") 

如果要使用$LINE作爲對隨後的命令(在此情況下echo)參數的序列,然後換行最終由空間中word splitting替換。這會使多餘的tr;你不妨這樣做:

LINE=$(cat "$FILENAME") 

甚至更​​好:

LINE=$(< "$FILENAME") 

詞的拆分是不是雙引號內有效;所以echo "$LINE"仍然需要tr刪除換行符。

+0

'$(...)'不能用空格替換換行符 - 它唯一能做的就是修剪*拖尾*換行符(無論多少)。因此,您的備用解決方案無法按預期工作。另外,請雙引號'$ FILENAME'引用。 – mklement0

+0

@ mklement0:你是對的;關於消失換行符的真相有點複雜。我做了一個編輯來重述那個。 –

+1

感謝您的編輯,但需要注意的是,在*變量賦值期間不涉及單詞拆分* - 如果$ FILENAME的內容具有*內部*換行符,它們將以* $結尾LINE'。只有當你稍後*引用*'$ LINE' *而沒有引用*那個詞分裂發生時 - 以及其他shell擴展,比如globbing,這可能或可能不需要。 – mklement0

2

您應該使用命令替換這樣的:

LINE=$(tr '\n' ' ' < "$FILENAME") 

但是,這將TR的輸出存儲到LINE變量。

+0

問題得到解決,但什麼是差異? – user3137879

+0

'命令替換'的語法或者是back-tick或'$(..)' – anubhava

+2

@ user3137879:如果你沒有賦值'$(...)'(或反引號),你可以指定*字符串*到'LINE'。命令替換意味着'$(...)'中包含的字符串被解釋爲一個命令並執行,並且它的* result *然後被分配給'LINE'。 – mklement0

1

我認爲你需要把調用tr命令用反引號:

LINE=`tr '\n' ' ' < $FILENAME` 
+2

Works,但反引號的使用已被棄用,以支持'$(...)'語法 - 後者的優點是它可以嵌套。 – mklement0