首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >-ex << EOF .EOF或此处文档和变量展开

-ex << EOF .EOF或此处文档和变量展开
EN

Stack Overflow用户
提问于 2017-08-01 07:45:18
回答 2查看 253关注 0票数 0

我不是一个巴什专家,也不能真正描述我的问题。所以我给你看我的剧本:

代码语言:javascript
复制
#!/bin/bash -x
bash -ex << TRY
  VAR1="123"
  echo "$VAR1"
TRY
echo "exit code: $?"

当我运行这个脚本时,它会产生以下输出:

代码语言:javascript
复制
+ bash -ex
+ VAR1=123
+ echo ''

+ echo 'exit code: 0'
exit code: 0

我的问题是:为什么没有在回显命令中分配变量VAR1?我期望得到以下输出:

代码语言:javascript
复制
+ bash -ex
+ VAR1=123
+ echo ''
123
+ echo 'exit code: 0'
exit code: 0
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-08-01 07:59:43

这是因为$VAR1甚至在进入bash实例之前就会由当前的shell展开。

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

代码语言:javascript
复制
bash -ex << "TRY"
  VAR1="123"
  echo "$VAR1"
TRY

来自巴什手册

3.6.6在此文件 这种类型的重定向指示shell从当前源读取输入,直到看到一行只包含单词(没有尾随空格)为止。然后,读取到该点的所有行都被用作命令的标准输入(如果指定了n,则使用文件描述符n)。 这里文件的格式是: n<<-word此处-文档分隔符 对word不执行参数和变量展开、命令替换、算术展开或文件名展开。如果引用word的任何部分,则分隔符是删除word引号的结果,此处文档中的行不会展开。如果word未引用,则此处文档的所有行都会受到参数展开、命令替换和算术扩展,字符序列\newline将被忽略,“\”必须用于引用字符“\”、“$”和“`”。 如果重定向运算符为“<<-”,则从输入行和包含分隔符的行中删除所有前导制表符。这使得shell脚本中的文档可以以一种自然的方式缩进。

票数 1
EN

Stack Overflow用户

发布于 2017-08-01 08:06:58

因为您的Try/Catch是一个本地文档,所以shell会进行变量扩展。

试试这个:

代码语言:javascript
复制
#!/bin/bash -x
bash -ex << \TRY
  VAR1="123"
  echo "$VAR1"
TRY
echo "exit code: $?"

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45431848

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档