假如我们有一个文本文件 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”换行符为分隔的依据,就顺利地原样输出了。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐