sh读取命令为何会吞噬输入中的反斜杠?

40

或许最容易用一个例子来解释:

$ echo '\&|'
\&|
$ echo '\&|' | while read in; do echo "$in"; done
&|

看起来read命令正在将输入中的反斜杠解释为转义字符并将其删除。我需要逐行处理文件而不改变其内容,但我不确定如何阻止read在此处智能化。有什么想法吗?

2个回答

57
根据http://www.vias.org/linux-knowhow/bbg_sect_08_02_01.html的描述:
-r
如果给出了此选项,反斜杠就不会被视为转义字符。反斜杠将被视为行的一部分。 特别地,反斜杠和换行符组合不能用作行续行。
在我的机器上可以正常运行。
$ echo '\&|' | while read -r in; do echo "$in"; done
\&|

1
太棒了,谢谢!我感到有点蠢,因为我没有找到这个文档,但这是那种很难搜索的东西,因为术语相当通用 :( - Jeremy Huiskamp
顺便问一下,你用的是哪个Shell不需要-r选项?我用的是bash。 - Jeremy Huiskamp
请注意,在zsh中读取时,这并不完全正确:内置命令文档。 区别在于:如果-r在行末,则只会打印''。因此,如果输入foo\nbar,则read -r in && echo $in将会输出两行。 - normanius
1
@normanius 不同之处不在于read,而在于echo - zsh内置的echo默认情况下会转换转义序列,如\n,而bash内置的echo需要使用echo -e选择启用转义处理。 - Ian Roberts

7

谢谢Alex。不幸的是,我只能标记一个答案,而Zsolt仅仅比你早了一分钟 :) - Jeremy Huiskamp
嘿,我知道,对于大多数问题,Stack Overflow就像一场百米赛跑!-) - Alex Martelli

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接