我想從文件中讀取一個字符串,並將其打印如下字符串:閱讀從文件
LINE=tr '\n' ' ' < $FILENAME
x1=$LINE
echo $LINE
但命令echo $LINE
顯示一個空行?
我想從文件中讀取一個字符串,並將其打印如下字符串:閱讀從文件
LINE=tr '\n' ' ' < $FILENAME
x1=$LINE
echo $LINE
但命令echo $LINE
顯示一個空行?
前面已經指出的其他海報,到tr
命令的輸出嵌入到另一個命令(在這種情況下, LINE=...
),圍繞tr
命令$(...)
。在bash中,這被稱爲command substitution。
LINE=$(tr '\n' ' ' < "$FILENAME")
如果要使用$LINE
作爲對隨後的命令(在此情況下echo
)參數的序列,然後換行最終由空間中word splitting替換。這會使多餘的tr
;你不妨這樣做:
LINE=$(cat "$FILENAME")
甚至更好:
LINE=$(< "$FILENAME")
詞的拆分是不是雙引號內有效;所以echo "$LINE"
仍然需要tr
刪除換行符。
'$(...)'不能用空格替換換行符 - 它唯一能做的就是修剪*拖尾*換行符(無論多少)。因此,您的備用解決方案無法按預期工作。另外,請雙引號'$ FILENAME'引用。 – mklement0
@ mklement0:你是對的;關於消失換行符的真相有點複雜。我做了一個編輯來重述那個。 –
感謝您的編輯,但需要注意的是,在*變量賦值期間不涉及單詞拆分* - 如果$ FILENAME的內容具有*內部*換行符,它們將以* $結尾LINE'。只有當你稍後*引用*'$ LINE' *而沒有引用*那個詞分裂發生時 - 以及其他shell擴展,比如globbing,這可能或可能不需要。 – mklement0
您應該使用命令替換這樣的:
LINE=$(tr '\n' ' ' < "$FILENAME")
但是,這將TR的輸出存儲到LINE
變量。
問題得到解決,但什麼是差異? – user3137879
'命令替換'的語法或者是back-tick或'$(..)' – anubhava
@ user3137879:如果你沒有賦值'$(...)'(或反引號),你可以指定*字符串*到'LINE'。命令替換意味着'$(...)'中包含的字符串被解釋爲一個命令並執行,並且它的* result *然後被分配給'LINE'。 – mklement0
我認爲你需要把調用tr
命令用反引號:
LINE=`tr '\n' ' ' < $FILENAME`
Works,但反引號的使用已被棄用,以支持'$(...)'語法 - 後者的優點是它可以嵌套。 – mklement0
現在說這會給錯誤,不是嗎?使用命令替換。 – devnull