IT技术博客大学习 共学习 共进步

bash shell里反斜杠(backslash)和字符串原文输出(无转义)

never-online 2011-02-15 22:57:47 浏览 7,684 次
问题描述
逐行读文件一般的写法如下:
 
以下是代码片段:
cat filename | while read line; do 
echo $line; 
done

看上去没有什么问题, 而且是网上的同学都让你这么读. 实则有潜在问题很难发现.
我们知道echo 里是默认有转义的,一个"\"反斜杠默认不显示,两个则显示一个,如果你的file里有如下字符

以下是引用片段:
\s\\s\s

用上述的代码则输出:

以下是引用片段:
s\ss

这着实让我头痛...
在Baidu和google里搜索没有合适的结果,只能自己分析了.

分析
应该不是echo的问题. echo只是输出端, 每个语言的输出都有各自的转义, 举例即是如果变量用单引号声明则是原文输出, 那么上面的line是个变量.
所以问题自然在要么是cat么,要么是read有问题.

测试及结论
cat file里的文件出来仍然是原文\s\\s\s
考虑是否是read有问题. help read出来的文档里是有参数可查的. 查到是参数"r".

以下是引用片段:
If the -r option is given, this signifies `raw’ input, and
backslash escaping is disabled.

最后原文输出文件的内容代码如下:

以下是代码片段:

cat filename | while read -r line; do 
echo $line; 
done

建议继续学习

  1. Bash的模式和配置文件加载 (阅读 24,283)
  2. Bash脚本15分钟进阶教程 (阅读 8,903)
  3. Bash 小技巧:给目录加上书签,快速切换目录 (阅读 7,946)
  4. grep 正则表达式选项要记得转义 (阅读 6,443)
  5. Bash如何取得当前正在执行的脚本的绝对路径? (阅读 5,846)
  6. 【总结】美化bash,python的soap client,python获取系统编码函数 (阅读 5,285)
  7. Bash Shell 快捷键 (阅读 4,885)
  8. bash下利用trap捕捉信号量 (阅读 4,843)
  9. 正则转义符汇总 (阅读 4,320)
  10. .bash_pfofile、.bash_logout和.bashrc (阅读 4,223)