为什么要数量掌握bash编程,因为它是linux下的默认工具。任何时候与系统内核对话,我们都直接面对shell。操作系统提供了为数众多的便利工具,用于完成复杂的操作。
今天我们说一个最为常用的输出字符串的指令 echo。
为什么说这个最常用的指令呢?因为很多人每天都在用。却在使用过程中遇到了大大小小许许多多的坑而不可避免。今天我们通过一个问题,给出解决方案。带领读者深入的了解一下bash内层的原理对echo的影响。
假如我们有一个文本文件 coder.txt,内容如下:
Twinkle, twinkle, little star,
How I wonder what you are.
然后我们使用 cat 逐行打印这个文件,在终端中执行以下指令:
cat coder.txt
输出效果:
那么现在有一个需求,假如需要对每行文本做进一步的处理,在bash中使用for循环逐行处理。我们先这样写:
for f in `cat coder.txt`; do echo $f; done
我们预期会像cat指令一样输出两行文本,但实际上不是这样的。下面是输出的情况:
可以注意到。每行文本中间有空格的地方,在打印的时候都会另起一行。
有没有什么解决方案呢?
有人说你只需要在变量外层加上双引号,就可以作为一行字符串处理了。事实会是这样的吗?我们测试一下。
可以看到双引号对变量不起任何作用。
那么还有的同学,经过参考man page之后,觉得应该给echo指令加上一些选项。比如下面这样:
我们分别测试了 -e 选项,和 -ne 选项,发现都不行。
之所以会产生上面的疑惑,根源还在于对bash脚本的一些固有解析方式原理的不够了解。
下面我们直接给出解决方案。然后,分析为什么会起作用?
IFS=$'n'
for i in `cat coder.txt`; do echo "$i"; done
unset IFS
下面是运行效果:
可以注意到,本质上循环打印没有改变,只是在执行前后对常量 IFS 进行了人为指定。
原来,bash循环默认使用空格作为分隔的依据。
我们只用手动指定 “n”换行符为分隔的依据,就顺利地原样输出了。
“书读百遍,其义自见”!
多敲打,多参考 man page,可以让基本功逐日增强。
HAppy coding :_)