我不是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
答案 0 :(得分:1)
因为$VAR1
在进入bash实例之前被当前shell扩展了。
TRY
。 (您可以使用单引号或双引号。)
bash -ex << "TRY"
VAR1="123"
echo "$VAR1"
TRY
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令牌来实现。但是,如果您想要执行变量替换,请不要引用它。