我不是一个巴什专家,也不能真正描述我的问题。所以我给你看我的剧本:
#!/bin/bash -x
bash -ex << TRY
VAR1="123"
echo "$VAR1"
TRY
echo "exit code: $?"当我运行这个脚本时,它会产生以下输出:
+ bash -ex
+ VAR1=123
+ echo ''
+ echo 'exit code: 0'
exit code: 0我的问题是:为什么没有在回显命令中分配变量VAR1?我期望得到以下输出:
+ bash -ex
+ VAR1=123
+ echo ''
123
+ echo 'exit code: 0'
exit code: 0发布于 2017-08-01 07:59:43
这是因为$VAR1甚至在进入bash实例之前就会由当前的shell展开。
如果不希望从外部展开变量,请引用下面的TRY。(您可以使用单引号或双引号。)
bash -ex << "TRY"
VAR1="123"
echo "$VAR1"
TRY来自巴什手册
3.6.6在此文件 这种类型的重定向指示shell从当前源读取输入,直到看到一行只包含单词(没有尾随空格)为止。然后,读取到该点的所有行都被用作命令的标准输入(如果指定了n,则使用文件描述符n)。 这里文件的格式是: n<<-word此处-文档分隔符 对word不执行参数和变量展开、命令替换、算术展开或文件名展开。如果引用word的任何部分,则分隔符是删除word引号的结果,此处文档中的行不会展开。如果word未引用,则此处文档的所有行都会受到参数展开、命令替换和算术扩展,字符序列\newline将被忽略,“\”必须用于引用字符“\”、“$”和“`”。 如果重定向运算符为“<<-”,则从输入行和包含分隔符的行中删除所有前导制表符。这使得shell脚本中的文档可以以一种自然的方式缩进。
发布于 2017-08-01 08:06:58
因为您的Try/Catch是一个本地文档,所以shell会进行变量扩展。
试试这个:
#!/bin/bash -x
bash -ex << \TRY
VAR1="123"
echo "$VAR1"
TRY
echo "exit code: $?"这也可以通过引用heredoc令牌来实现。但是,如果希望执行变量替换,请不要引用它。
https://stackoverflow.com/questions/45431848
复制相似问题