2017-08-01 38 views
0

我不是bash专家,无法真正描述我的问题。这就是为什么我会告诉你我的脚本:bash try/catch行为bash -ex << EOF ... EOF或Here文档和变量扩展

#!/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没有echo命令分配?我希望下面的输出:

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

这不是真正的异常处理。这只是一个单独的程序,可以提前中止,而且只有在传递给'bash'的脚本根本不需要从标准输入中读取的情况下才有效。 – chepner

+0

这就是我需要的用例,谢谢澄清 – hellomichibye

回答

1

这是因为$VAR1变得更加进入bash的情况下,当前shell之前扩大。

如果您不想从外部扩展变量,请按如下所示报价TRY。 (您可以使用单或双引号)。

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

Bash manual

3.6.6这里文档

这种类型的重定向指示shell从当前 读取输入直到只看到包含单词的行(没有尾随 空白)。所有到此为止读取的行然后被用作 命令的标准输入(或文件描述符n,如果指定n),则使用 。

这里的文档的格式是:

[n]的< < [ - ]字01​​这里文档定界符

无参数和变量扩展,命令替换算术 膨胀,或文件名扩展在单词上执行。如果引用 单词的任何部分,则分隔符是单词 上的引号删除的结果,并且此文档中的行不会展开。如果单词是 未加引号,则此文档中的所有行均受参数 扩展,命令替换和算术扩展的限制, 字符序列\换行符将被忽略,并且'\'必须用于引用 字符'\ ','$'和'`'。

如果重定向操作符为'< < - ',则所有前导制表符 从输入行和包含分隔符的行中剥离。这个 允许在这里 - 外壳脚本内的文件以自然的方式缩进。

0

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

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

这可太引述的定界符标记来实现。但是,如果要执行变量替换,请不要引用它。