都Linux的老司机了,连个echo都用不好,大概火候差在这

引言为什么要数量掌握bash编程 , 因为它是linux下的默认工具 。任何时候与系统内核对话 , 我们都直接面对shell 。操作系统提供了为数众多的便利工具 , 用于完成复杂的操作 。
今天我们说一个最为常用的输出字符串的指令 echo 。
为什么说这个最常用的指令呢?因为很多人每天都在用 。却在使用过程中遇到了大大小小许许多多的坑而不可避免 。今天我们通过一个问题 , 给出解决方案 。带领读者深入的了解一下bash内层的原理对echo的影响 。

都Linux的老司机了,连个echo都用不好,大概火候差在这

文章插图
 
问题的提出假如我们有一个文本文件 coder.txt , 内容如下:
Twinkle, twinkle, little star,How I wonder what you are.然后我们使用 cat 逐行打印这个文件 , 在终端中执行以下指令:
cat coder.txt输出效果:
都Linux的老司机了,连个echo都用不好,大概火候差在这

文章插图
 
那么现在有一个需求 , 假如需要对每行文本做进一步的处理 , 在bash中使用for循环逐行处理 。我们先这样写:
for f in `cat coder.txt`; do echo $f; done我们预期会像cat指令一样输出两行文本 , 但实际上不是这样的 。下面是输出的情况:
都Linux的老司机了,连个echo都用不好,大概火候差在这

文章插图
 
可以注意到 。每行文本中间有空格的地方 , 在打印的时候都会另起一行 。
【都Linux的老司机了,连个echo都用不好,大概火候差在这】有没有什么解决方案呢?
有人说你只需要在变量外层加上双引号 , 就可以作为一行字符串处理了 。事实会是这样的吗?我们测试一下 。
都Linux的老司机了,连个echo都用不好,大概火候差在这

文章插图
 
可以看到双引号对变量不起任何作用 。
那么还有的同学 , 经过参考man page之后 , 觉得应该给echo指令加上一些选项 。比如下面这样:
都Linux的老司机了,连个echo都用不好,大概火候差在这

文章插图
 
我们分别测试了 -e 选项 , 和 -ne 选项 , 发现都不行 。
原理之所以会产生上面的疑惑 , 根源还在于对bash脚本的一些固有解析方式原理的不够了解 。
下面我们直接给出解决方案 。然后 , 分析为什么会起作用?
IFS=$'n'for i in `cat coder.txt`; do echo "$i"; doneunset IFS下面是运行效果:
都Linux的老司机了,连个echo都用不好,大概火候差在这

文章插图
 
可以注意到 , 本质上循环打印没有改变 , 只是在执行前后对常量 IFS 进行了人为指定 。
原来 , bash循环默认使用空格作为分隔的依据 。
我们只用手动指定 “n”换行符为分隔的依据 , 就顺利地原样输出了 。
 
写在最后“书读百遍 , 其义自见”!
多敲打 , 多参考 man page , 可以让基本功逐日增强 。
HAppy coding :_)




    推荐阅读