有关导出和$()双引号的小问题

时间:2018-11-01 14:21:47

标签: bash quotes

当我在文件export X="test"中写入test.sh并在外壳引号中执行$(cat test.sh)时,即echo $X给出"test"export X="test"直接在外壳中会使引号消失,即echo $X给出test为什么?

我似乎正在执行相同的代码,并且它弄乱了我的路径:)

2 个答案:

答案 0 :(得分:1)

两者之间的区别是引号删除。在手册页中,

  

删除行情

     

在前面的扩展之后,所有非引号出现的字符\,'和“不是由          上述扩展之一被删除。

$(cat test.sh)中,最终命令包含由命令替换引起的未加引号的"字符。命令替换产生了export X="test",该命令分为命令字export及其字面量X="test"

export X="test"中,命令再次是export,参数为X="test"但是这些引号未加引号,也不由任何扩展产生,因此它们被删除。结果是命令export接收到X=test(而不是X="test")作为参数。

每个export命令然后在=上拆分其参数,将X视为要定义的变量。一个人看到test的右侧用作值,另一个人看到"test"用作值,导致观察到的分配不同。

答案 1 :(得分:0)

给出一个包含短语test.sh的文件export X="test",命令cat test.sh输出带有转义双引号export X=\"test\"的字符串,该字符串在bash控制台中打印为{ {1}}。

这就是为什么我给我留下的印象是我执行了相同的代码,但是在第一种情况下,我影响了export X="test"\"test\",而在第二种情况下,我影响了X它。

我首先使用然后在其他地方看到的解决方案是将test的输出传递到cat,注意单引号sed 's/"//g'而不是双引号'

感谢亨德里克·普林斯露提供以上参考。