bash学习过程中的疑问3:到底带不带引号?

执行以下命令,从终端中获得一个输入,赋值给变量a
a=$(cat)
当我在终端下输入如下字符串的时候:

hello
world

那么此时的a=$(cat)是等价于
a="hello world"
还是
a=hello world
即此时的$(cat)被替换成了hello world还是"hello world"

我想应该是被替换成了"hello world", 因为如果是a=hello world,会报错,但这条命令正确执行了。

img

img

但是如果我改变一下命令,加一个括号
a=($(cat))

如果我们依然将$(cat)展开为"hello world",那么
a=("hello world")
a就变成了一个只有元素hello world的数组,但是事实却并非如此,此时的a是一个包含两个元素helloworld的数组,即此时的$(cat)展开为不带引号的hello world才是对的。和上面是矛盾的。

img

这个问题,我思考了一下,不太能表述清楚,需要你自己理解一下,
双引号其实是我们要告诉shell这个字符串是否为一个整体,而非shell反馈给我们这个字符串是不是一个整体的标识。
拿你上面的举个例子

a=$(cat)#在这里a接受的是cat的命令返回值,cat有合并输出的作用,它会把hello world作为一个整体输出给a,shell再去获取这个a时它就是hello world
a=($(cat))  #在这里同样hello wolrd被作为一个整体输出到列表中即(hello world),shell再去解析这个列表时被当做两个元素。
a=("$(cat)")   #这里我们用”“告诉shell要把输出的结果作为一个整体的字符串输出给列表即("hello world"),接下来shell去解析这个列表时只有一个元素,那就是hello world

不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!