当前位置: 首页 > 知识库问答 >
问题:

shell/bash同时读取导出变量不适用于subtitute[重复]

刘辰钊
2023-03-14

我想从文件中导出变量。这是我的文件

cat file.txt
VERSION=1.0.0
LOCATION=USA
NAME=sample
ENVIRONMENT=$ENV

我使用此while循环导出该文件上的所有变量

while read vars; do export $vars;done < file.txt

所有变量都成功导出,除了ENVIRONMENT我得到了这个值,ENVIRONMENT=$ENV(期望值是ENVIRONMENT=staging)。

printenv | grep ^ENV
ENV=staging

我的问题是,为什么在使用while循环时它不起作用,但如果我们手动导出(例如导出ENVIRONMENT=$ENV)

实际上有很多方法,从文件中导出变量,例如,我可以使用envsubst


共有1个答案

劳灵均
2023-03-14

POSIX中描述了扩展的顺序:

单词扩展的顺序如下:

> < li>

应从始至终执行波浪号展开(参见波浪号展开)、参数展开(参见参数展开)、命令替换(参见命令替换)和算术展开(参见算术展开)。请参见令牌识别中的第5项。

除非IFS为空,否则应在步骤1生成的字段部分上执行字段拆分(见字段拆分)。

除非set-f有效,否则应执行路径名扩展(请参见路径名扩展)。

报价删除(请参阅报价删除)应始终最后执行。

对于参数扩展,TL;博士是:

${参数}

参数的值(如果有)应被替换。

您会注意到,该定义不是递归的或多次传递的。没有“5.返回步骤1并重复,直到无法执行进一步的扩展”,或“参数的值(如果有)应被替换,并重复该过程,直到无法找到更多的参数扩展。”

这意味着export$vars将在步骤1中扩展$vars,但不会重复该步骤,因此不会重复$ENV

这也是所有其他编程语言的基本工作方式,例如Java:

String foo="bar";
String bar="baz";
// Prints `bar` without recursively resolving it into `baz`
System.out.println(foo);  
 类似资料:
  • 我们有一个问题,我可以用这个简单的例子重现。我有以下示例shell脚本文件,名为SO shell。txt 当我运行时,我得到以下输出: 脚本执行完毕后,如果我在shell命令行执行以下命令: 我看不到任何东西(即shell变量没有被分配到shell脚本的生命周期之外) Q) 如何使shell变量超过其定义shell脚本的寿命?

  • 我有两个shell脚本: 第一个:<代码>1。sh,其内容如下: 第二:<代码>2。sh,其内容如下: 两者都具有执行权限。当我运行<代码>2时。sh,我希望环境变量PROP由1设置和导出。sh,对。这里怎么了?

  • 我甚至无法从脚本中导出最简单的变量来在bash中工作——我错了什么? 文件test.sh: bash测试: 编辑: 我现在从答案中知道,这行不通-但是,如何在进程之间记住单个变量呢?我需要将其存储在文件中吗?

  • 我有变量< code>$foo="something",我想使用: 让“某事”得到回应。

  • 问题内容: 我正在尝试为变量分配数组长度。 它说找不到len命令。为什么? 问题答案: 变量名和赋值运算符之间不能有空格。如果这样做,会将变量名称视为命令。 尝试:

  • 问题内容: from celery import Celery 这是我用来测试芹菜的代码。我希望每次使用addone()时,返回值都应该增加。但是为什么总是1? 结果 问题答案: 默认情况下,启动工作程序时,Celery以并发4启动它,这意味着它已启动4个进程来处理任务请求。(加上一个控制其他进程的进程。)我不知道该使用哪种算法将任务请求分配给为工作人员启动的进程,但是最终,如果执行足够,您将看到