2014-01-15 125 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