bash try / catch行为bash -ex<< EOF ... EOF或Here文档和变量扩展

时间:2017-08-01 07:45:19

标签: bash

我不是bash专家,也不能真正描述我的问题。这就是我向你展示我的剧本的原因:

#!/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

我的问题:为什么在echo命令中没有分配变量VAR1?我希望得到以下结果:

+ bash -ex
+ VAR1=123
+ echo ''
123
+ echo 'exit code: 0'
exit code: 0

2 个答案:

答案 0 :(得分:1)

因为$VAR1在进入bash实例之前被当前shell扩展了。

如果您不希望从外部扩展变量,请按以下方式引用TRY。 (您可以使用单引号或双引号。)

bash -ex << "TRY"
  VAR1="123"
  echo "$VAR1"
TRY

来自Bash manual

  

3.6.6此处文件

     

这种重定向指示shell从中读取输入   当前源直到一行只包含单词(没有尾随   看到空白。然后使用读取到该点的所有行   作为标准输入(或指定n时的文件描述符n)   命令。

     

here-documents的格式为:

     

[N]&LT;&LT; [ - ]字           here-document delimiter

     

无参数和变量扩展,命令替换,算术   对单词执行扩展或文件名扩展。如果有的话   单词被引用,分隔符是单词上引用删除的结果,   并且不会扩展here-document中的行。如果是的话   如果没有引用,here-document的所有行都会受到参数的影响   扩展,命令替换和算术扩展,   字符序列\换行符被忽略,'\'必须用于引用   字符'\','$'和'`'。

     

如果重定向运算符是'&lt;&lt; - ',那么所有前导制表符都是   从输入行和包含分隔符的行中删除。这个   允许here脚本中的文档以自然方式缩进   方式。

答案 1 :(得分:0)

由于您的Try/Catch是一个heredoc,因此shell会进行变量扩展。
试试这个:

#!/bin/bash -x
bash -ex << \TRY
  VAR1="123"
  echo "$VAR1"
TRY
echo "exit code: $?"

这也可以通过引用heredoc令牌来实现。但是,如果您想要执行变量替换,请不要引用它。