前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >编程短文:Bash echo如何原生输出带空格的字符串而不换行

编程短文:Bash echo如何原生输出带空格的字符串而不换行

作者头像
程序员小助手
发布2020-05-26 11:30:49
4.2K0
发布2020-05-26 11:30:49
举报

引言

为什么要数量掌握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 :_)

我是 @程序员小助手 ,持续分享编程知识,欢迎关注。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-05-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员小助手 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 引言
  • 问题的提出
  • 原理
  • 写在最后
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档