命令的输出保存到变量中保留输换行符的问题

sh/bash/dash/ksh/zsh等Shell脚本
回复
liph
帖子: 1
注册时间: 2020-07-03 4:06
系统: ubuntu,debian,win10

命令的输出保存到变量中保留输换行符的问题

#1

帖子 liph » 2020-07-16 21:01

学习linux shell脚本攻略这本书中,里面有这样一段

假设我们使用子shell或反引用的方法将命令的输出保存到变量中,为了保留输出的空格和换行符(\n),必须使用双引号。
例如:

$ cat text.txt
1
2
3
$ out=$(cat text.txt)
$ echo $out
1 2 3 # 丢失了1、2、3中的\n
$ out="$(cat text.txt)"
$ echo $out
1
2
3

但我测试时发现使用双引号依然丢失换行

$ cat text.txt
1
2
3
$ out="$(cat text.txt)"
$ echo $out
1 2 3

请问这是否是bash版本的区别
bash --version
GNU bash,版本 5.0.3(1)-release (x86_64-pc-linux-gnu)
头像
astolia
论坛版主
帖子: 6444
注册时间: 2008-09-18 13:11

Re: 命令的输出保存到变量中保留输换行符的问题

#2

帖子 astolia » 2020-07-17 10:27

你只是将换行保留到了变量里。echo输出时又没加引号
差不多就是

代码: 全选

echo a    b

代码: 全选

echo "a    b"
的区别了
whqcraftsman
帖子: 2
注册时间: 2020-07-30 18:04
系统: ubuntu

Re: 命令的输出保存到变量中保留输换行符的问题

#3

帖子 whqcraftsman » 2020-07-30 18:36

与使用的shell、或者说echo的版本确实有关,比如zsh的echo是built-in的,行为与bourne shell / bash或有不同。

代码: 全选

# Try it using zsh
cat <<EOF > tmp
>1
>2
>3
>EOF
out=$(cat tmp)
echo $out
关于bourne shell / bash,对于类似这样的命令行:

代码: 全选

prog <arg>...
  • 命令行如何解析
在实际执行命令前,先变量展开,所以相当于echo $out -> echo 1\n2\n3\n
  • 命令行如何解析多个arguments?
一般用whitespace(space、tab、\n)区分,所以echo $out有3个arguments
  • echo是如何把多个arguments串起来的?
使用C语言的putchar(' '),所以结果是1 2 3
  • 最后,为什么使用单/双引号?
因为被引号引起来的部分会成为一个整体,这个整体内的字符串如何处理,就完全由源程序决定了。
回复