HH123_3 2022-04-28 10:33 采纳率: 86.8%
浏览 44
已结题

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

  • 写回答

2条回答 默认 最新

  • ioryhm 2022-04-29 09:44
    关注

    这个问题,我思考了一下,不太能表述清楚,需要你自己理解一下,
    双引号其实是我们要告诉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
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 5月7日
  • 已采纳回答 4月29日
  • 创建了问题 4月28日

悬赏问题

  • ¥15 微信小程序协议怎么写
  • ¥15 c语言怎么用printf(“\b \b”)与getch()实现黑框里写入与删除?
  • ¥20 怎么用dlib库的算法识别小麦病虫害
  • ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启
  • ¥15 java写代码遇到问题,求帮助
  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看