![cover](https://img-blog.csdnimg.cn/img_convert/879765e7d2b83a70fc22a0e1dd2a296d.png)
Bash shell echo如何原生输出带空格的字符串而不换行
假如我们有一个文本文件 coder.txt,内容如下:Twinkle, twinkle, little star,How I wonder what you are.然后我们使用 cat 逐行打印这个文件,在终端中执行以下指令:cat coder.txt输出效果:那么现在有一个需求,假如需要对每行文本做进一步的处理,在bash中使用for循环逐行处理。我们先这样写:for f in `cat co
假如我们有一个文本文件 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”换行符为分隔的依据,就顺利地原样输出了。
更多推荐
所有评论(0)