<返回更多

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

2021-02-26    
加入收藏

引言

为什么要数量掌握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都用不好,大概火候差在这

 

可以看到双引号对变量不起任何作用。

那么还有的同学,经过参考man page之后,觉得应该给echo指令加上一些选项。比如下面这样:

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

 

我们分别测试了 -e 选项,和 -ne 选项,发现都不行。

原理

之所以会产生上面的疑惑,根源还在于对bash脚本的一些固有解析方式原理的不够了解。

下面我们直接给出解决方案。然后,分析为什么会起作用?

IFS=$'n'
for i in `cat coder.txt`; do echo "$i"; done
unset IFS

下面是运行效果:

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

 

可以注意到,本质上循环打印没有改变,只是在执行前后对常量 IFS 进行了人为指定。

原来,bash循环默认使用空格作为分隔的依据

我们只用手动指定 “n”换行符为分隔的依据,就顺利地原样输出了。

 

写在最后

“书读百遍,其义自见”!

多敲打,多参考 man page,可以让基本功逐日增强。

HAppy coding :_)

声明:本站部分内容来自互联网,如有版权侵犯或其他问题请与我们联系,我们将立即删除或处理。
▍相关推荐
更多资讯 >>>