执行以下命令,从终端中获得一个输入,赋值给变量aa=$(cat)
当我在终端下输入如下字符串的时候:
hello
world
那么此时的a=$(cat)
是等价于a="hello world"
还是a=hello world
即此时的$(cat)
被替换成了hello world
还是"hello world"
我想应该是被替换成了"hello world"
, 因为如果是a=hello world
,会报错,但这条命令正确执行了。
但是如果我改变一下命令,加一个括号a=($(cat))
如果我们依然将$(cat)
展开为"hello world"
,那么a=("hello world")
a就变成了一个只有元素hello world
的数组,但是事实却并非如此,此时的a是一个包含两个元素hello
和world
的数组,即此时的$(cat)
展开为不带引号的hello world
才是对的。和上面是矛盾的。
这个问题,我思考了一下,不太能表述清楚,需要你自己理解一下,
双引号其实是我们要告诉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、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!