我想从文件中读取一个字符串,并将其打印如下字符串:阅读从文件
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